From b18fcf2165eeae019d7046c9e50a9ad5e84978e7 Mon Sep 17 00:00:00 2001 From: Ramesh Padmanabhaiah Date: Sat, 9 Mar 2019 15:52:34 -0800 Subject: [PATCH 01/84] First commit --- README.md | 87 ++++++++++++++++++ base_init.sh | 76 +++++++++++++++ company/bin/test_command1 | 3 + company/lib/bashrc | 4 + docs/img/directory_structure.png | Bin 0 -> 109476 bytes lib/base_defaults.sh | 27 ++++++ lib/bash_profile | 28 ++++++ lib/bashrc | 64 +++++++++++++ lib/shopt.sh | 27 ++++++ lib/stdlib.sh | 148 ++++++++++++++++++++++++++++++ lib/stdprofile.sh | 44 +++++++++ team/test-team1/bin/test_command1 | 3 + team/test-team1/lib/bashrc | 3 + team/test-team1/lib/test-team1.sh | 3 + team/test-team2/bin/test_command1 | 3 + team/test-team2/lib/bashrc | 3 + team/test-team2/lib/test-team2.sh | 3 + user/test_user1.sh | 18 ++++ user/test_user2.sh | 17 ++++ 19 files changed, 561 insertions(+) create mode 100644 README.md create mode 100755 base_init.sh create mode 100755 company/bin/test_command1 create mode 100644 company/lib/bashrc create mode 100644 docs/img/directory_structure.png create mode 100644 lib/base_defaults.sh create mode 100644 lib/bash_profile create mode 100644 lib/bashrc create mode 100644 lib/shopt.sh create mode 100644 lib/stdlib.sh create mode 100644 lib/stdprofile.sh create mode 100644 team/test-team1/bin/test_command1 create mode 100644 team/test-team1/lib/bashrc create mode 100644 team/test-team1/lib/test-team1.sh create mode 100644 team/test-team2/bin/test_command1 create mode 100644 team/test-team2/lib/bashrc create mode 100644 team/test-team2/lib/test-team2.sh create mode 100644 user/test_user1.sh create mode 100644 user/test_user2.sh diff --git a/README.md b/README.md new file mode 100644 index 0000000..d6b5840 --- /dev/null +++ b/README.md @@ -0,0 +1,87 @@ +# **What is Base?** + +Base is a way for Bash users to organize the following across multiple hosts: + +* .bash_profile +* .bashrc +* generic Bash libraries and commands +* company specific Bash libraries and commands +* team specific Bash libraries and commands +* user specific settings (aliases, functions, Bash settings) +* share Bash libraries and commands across teams + +# **How can I get set up?** + +You can get set up in a very short time. Essentially, this is what you have to do: + +* Check out Base. The standard convention is $HOME/git/base. In case your git directory is elsewhere, symlink it to `$HOME/git`. +* Consolidate your profile specifics from your current `.bash_profile` and `.bashrc` into `.sh` file. Place this file under `base/user` directory. +* Make a backup of your `.bash_profile`. Replace this file with a symlink to `base/lib/bash_profile`. +* Make a backup of your `.bashrc`. Replace this file with a symlink to `base/lib/bashrc`. + +Here is the code: + + cd $HOME + mkdir git && cd git + git clone git@github.com:codeforester/base.git + cd $HOME + mv .bash_profile .bash_profile.safe && ln -sf $HOME/git/base/lib/bash_profile .bash_profile + mv .bashrc .bashrc.safe && ln -sf $HOME/git/base/lib/bashrc .bashrc + +# **How does Base work?** + +In a typical setting `.bashrc` sources in `$BASE_HOME/base_init.sh` which does the following: + +* sources in `lib/stdprofile.sh`, `lib/stdlib.sh`, and `user/.sh` if it exists, in that order +* updates `$PATH` to include the relevant `bin` directories + * `$BASE_HOME/company/bin` is always added + * `$BASE_HOME/team/$BASE_TEAM/bin` is added if `$BASE_TEAM` is set in `user/.sh` + * `$BASE_HOME/team/$BASE_TEAM/bin` is added for each team defined in `$BASE_SHARED_TEAMS` (space-separated string), set in `user/.sh` + +# **Directory structure** + +[![Screenshot of directory structure](./docs/img/directory_structure.png)](./docs/img/directory_structure.png) + +# **Environment variables** + +* BASE_HOME +* BASE_DEBUG +* BASE_TEAM +* BASE_SHARED_TEAMS +* BASE_OS +* BASE_HOST + +# **FAQ** + +## My git location is not `$HOME/git/base`. What should I do? + +You can either + * specify your base location in `$HOME/.baserc`, like + + BASE_HOME=/path/to/base + + * symlink `$HOME/git/base` to the right place + +You need to do this on every host where you want base. + +## I don't want to keep my personal settings private, and not in git. What should I do? + + * write a one-liner in `user/.sh` like this: + + source /path/to/your.settings + +## I do want to use the default settings. What should I do? + +Add this to your `user/.sh` file: + + import lib/base_defaults.sh + +## I want to make sure I keep my base repository updated always. How can I do it? + +Add this to your `user/.sh` file: + + base_update + +# **Debugging** + +You can turn on debug mode by touching `$HOME/.base_debug` file. You can also do the same by setting environment variable `BASE_DEBUG` to 1. You can add `set -x` to `$HOME/.baserc` file to trace the execution. diff --git a/base_init.sh b/base_init.sh new file mode 100755 index 0000000..9f74bdf --- /dev/null +++ b/base_init.sh @@ -0,0 +1,76 @@ +# +# base_init.sh: top level script that should be sourced in, especially inside .bash_profile +# + +[[ -f $HOME/.base_debug ]] && export BASE_DEBUG=1 +base_debug() { [[ $BASE_DEBUG ]] && printf '%(%Y-%m-%d:%H:%M:%S)T %s\n' -1 "DEBUG ${BASH_SOURCE[0]}:${BASH_LINENO[1]} $@" >&2; } +base_error() { printf '%(%Y-%m-%d:%H:%M:%S)T %s\n' -1 "ERROR ${BASH_SOURCE[0]}:${BASH_LINENO[1]} $@" >&2; } + +set_base_home() { + script=$HOME/.baserc + [[ -f $script ]] && [[ ! $_baserc_sourced ]] && { + base_debug "Sourcing $script" + source "$script" + _baserc_sourced=1 + } + + # set BASE_HOME to default in case it is not set + [[ -z $BASE_HOME ]] && { + local dir=$HOME/git/base + base_debug "BASE_HOME not set; defaulting it to '$dir'" + BASE_HOME=$dir + } + + export BASE_HOME +} + +# +# source in stdprofile.sh and stdlib.sh +# +import_libs_and_profiles() { + local lib bin team + for lib in $BASE_HOME/lib/stdprofile.sh \ + $BASE_HOME/lib/stdlib.sh; do + [[ -f $lib ]] && { base_debug "Sourcing $lib" >&2; source "$lib"; } + done + + lib=$BASE_HOME/user/$USER.sh + [[ -f $lib ]] && ((_interactive)) && { base_debug "[interactive] Sourcing $lib" >&2; source "$lib"; } + + # + # team specific actions + # + # Users choose teams by setting the "BASE_TEAM" variable in their user specific startup script + # For example: BASE_TEAM=teamX + # + # Users can also set "BASE_SHARED_TEAMS" to more teams so as to share from those teams. + # For example: BASE_SHARED_TEAMS="teamY teamZ" + # + # We source the team specific startup script add the team bin directory to PATH, in the same order + # + for team in $BASE_TEAM $BASE_SHARED_TEAMS; do + lib=$BASE_HOME/team/$team/lib/bashrc + [[ -f $lib ]] && ((_interactive)) && { base_debug "[interactive] Sourcing $lib" >&2; source "$lib"; } + + lib=$BASE_HOME/team/$team/lib/$team.sh + [[ -f $lib ]] && { base_debug "Sourcing $lib" >&2; source "$lib"; } + + bin=$BASE_HOME/team/$team/bin + [[ -d $bin ]] && add_to_path "$bin" + done +} + +main() { + [[ $- = *i* ]] && _interactive=1 || _interactive=0 + + set_base_home + if [[ -d $BASE_HOME ]]; then + import_libs_and_profiles + add_to_path "$BASE_HOME/bin" "$BASE_HOME/company/bin" + dedupe_path + else + base_error "BASE_HOME '$BASE_HOME' is not a directory or is not accessible" + fi +} + +main diff --git a/company/bin/test_command1 b/company/bin/test_command1 new file mode 100755 index 0000000..affcdff --- /dev/null +++ b/company/bin/test_command1 @@ -0,0 +1,3 @@ +# +# test command +# diff --git a/company/lib/bashrc b/company/lib/bashrc new file mode 100644 index 0000000..5fdc94c --- /dev/null +++ b/company/lib/bashrc @@ -0,0 +1,4 @@ +# +# Company specific bashrc for interactive shells +# + diff --git a/docs/img/directory_structure.png b/docs/img/directory_structure.png new file mode 100644 index 0000000000000000000000000000000000000000..f5fd85f90df4ce864b3a8ae293d371db05cb0298 GIT binary patch literal 109476 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 Wv@#3^8Cbsu{>e!xN>+#)!~PF~W#e-I literal 0 HcmV?d00001 diff --git a/lib/base_defaults.sh b/lib/base_defaults.sh new file mode 100644 index 0000000..6e8bf3a --- /dev/null +++ b/lib/base_defaults.sh @@ -0,0 +1,27 @@ +# +# base_defaults.sh +# + +### +### Aliases +### +alias rm='rm -i' +alias cp='cp -i' +alias mv='mv -i' +alias h='history' + +### +### Command editing +### +set -o vi + +### +### Prompt +### +export PS1='\[\033[0;35m\]\T \h\[\033[0;33m\] \w\[\033[00m\]: ' + +### +### Bash history +### +export HISTCONTROL=ignoredups:erasedups +export HISTTIMEFORMAT="[%F %T] " diff --git a/lib/bash_profile b/lib/bash_profile new file mode 100644 index 0000000..e0242a2 --- /dev/null +++ b/lib/bash_profile @@ -0,0 +1,28 @@ +# +# .bash_profile +# + +[[ -f $HOME/.base_debug ]] && export BASE_DEBUG=1 +base_debug() { [[ $BASE_DEBUG ]] && printf '%(%Y-%m-%d:%H:%M:%S)T %s\n' -1 "DEBUG ${BASH_SOURCE[0]}:$LINENO $@" >&2; } + +base_debug "Running .bash_profile" + +# +# Source global profile +# +if shopt -q login_shell; then + global_profile=/etc/profile + if [ -f $global_profile ]; then + base_debug "Sourcing $global_profile" + source "$global_profile" + fi +fi + +# +# Source .bashrc +# +bashrc=$HOME/.bashrc +if [ -f $bashrc ]; then + base_debug "Invoking $bashrc from .bash_profile" + source "$bashrc" +fi diff --git a/lib/bashrc b/lib/bashrc new file mode 100644 index 0000000..ee2d32f --- /dev/null +++ b/lib/bashrc @@ -0,0 +1,64 @@ +# +# .bashrc +# + +[[ -f $HOME/.base_debug ]] && export BASE_DEBUG=1 +base_debug() { [[ $BASE_DEBUG ]] && printf '%(%Y-%m-%d:%H:%M:%S)T %s\n' -1 "DEBUG ${BASH_SOURCE[0]} $@" >&2; } +base_error() { printf '%(%Y-%m-%d:%H:%M:%S)T %s\n' -1 "ERROR ${BASH_SOURCE[0]} $@" >&2; } +base_debug "Running .bashrc" + +# +# Source global bashrc +# +global_bashrc=/etc/bashrc +if [ -f $global_bashrc ]; then + base_debug "Sourcing $global_bashrc" + source "$global_bashrc" +fi + +# +# base stuff +# + +base_init() { + local script + + script=$HOME/.baserc + [[ -f $script ]] && { + base_debug "Sourcing $script" + source "$script" + _baserc_sourced=1 + } + + # set BASE_HOME to default in case it is not set + [[ -z $BASE_HOME ]] && { + dir=$HOME/git/base + base_debug "Defaulting BASE_HOME to '$dir'" + export BASE_HOME=$dir + } + + [[ ! -d "$BASE_HOME" ]] && { + base_error "BASE_HOME directory '$BASE_HOME' does not exist" + return + } + + script=$BASE_HOME/base_init.sh + if [[ -f $script ]]; then + base_debug "Sourcing $script" + source "$script" + else + base_error "base init script '$script' does not exist; check your git repository" + return + fi + + # + # source in company specific bashrc if it exists + # + script=$BASE_HOME/company/lib/bashrc + [[ -f $script ]] && { + base_debug "Sourcing $script" + source "$script" + } +} + +base_init diff --git a/lib/shopt.sh b/lib/shopt.sh new file mode 100644 index 0000000..a75dd88 --- /dev/null +++ b/lib/shopt.sh @@ -0,0 +1,27 @@ +declare -A _shopt_restore +shopt_set() { + local opt count + for opt; do + if ! shopt -q "$opt"; then + echo "$opt not set, setting it" + shopt -s "$opt" + _shopt_restore[$opt]=1 + ((count++)) + else + echo "$opt set already" + fi + done +} + +shopt_restore() { + local opt + for opt; do + [[ ${_shopt_restore[$opt]} ]] && { + echo "unsetting $opt" + shopt -u "$opt" + unset _shopt_restore[$opt] + } || { + echo "$opt wasn't changed earlier" + } + done +} diff --git a/lib/stdlib.sh b/lib/stdlib.sh new file mode 100644 index 0000000..1b669c3 --- /dev/null +++ b/lib/stdlib.sh @@ -0,0 +1,148 @@ +# +# stdlib.sh - foundation library for Bash scripts +# +# we cover: +# - assertions +# - logging +# - error handling +# + +# +# import a library from $BASE_HOME/lib +# Example: +# import lib/logging.sh company/lib/xyz.sh ... +# +import() { + local lib + for lib; do + lib=$BASE_HOME/$lib + [[ -f "$lib" ]] && { + source "$lib" + } || { + printf 'ERROR: %s\n' "Library '$lib' does not exist" >&2 + } + done +} + +# +# Print components of $PATH, one on each line +# +print_path() { + local -a dirs + local dir + + IFS=: read -ra dirs <<< "$PATH" + for dir in "${dirs[@]}"; do + printf '%s\n' "$dir" + done +} + +dump_trace() { + local frame=0 + while caller "$frame"; do + ((frame++)) + done + printf '%s\n' "$@" +} + +exit_if_error() { + (($#)) || return + local num_re='^[0-9]+' + local rc=$1; shift + [[ $rc =~ $num_re ]] || return + ((rc)) && { + dump_trace "$@" + } +} + +# +# Given a version like x.y, where x and y are numbers, asserts that +# bash version is at least x.y +# +assert_minimum_bash_version() { + local version=$1 message=$2 + local version_array curr_version version_re='^[0-9]+\.[0-9]+$' + + assert_arg_count $# 1 "Usage: assert_minimum_bash_version version" + assert_regex_match "$version" "$version_re" "Version should be in the format x.y where x and y are integers" + version_array=(${version//\./ }) + (( BASH_VERSINFO[0] < version_array[0] || + ((BASH_VERSINFO[0] == version_array[0] && BASH_VERSINFO[1] < version_array[1])))) && { + curr_version="${BASH_VERSINFO[@]:0:4}" + [[ $message ]] || message="Running with Bash version ${curr_version// /.}; need $version or above" + printf '%s\n' "$message" >&2 + exit 1 + } + return 0 +} + +# +# test code - run this to test the functions in this library +# the tests run in a sub shell and hence won't exit the main shell in case of failures +# +test_stdlib() ( + assert_minimum_bash_version "$@" +) + +# +# exit if number of arguments passed doesn't meet expectations +# example call: +# assert_arg_count $# 2 "Need exactly two arguments" +# +assert_arg_count() { + local actual=$1 expected=$2 message=$3 + + ((actual != expected)) && { + [[ $message ]] || message="Expected $expected arguments, got $actual arguments" + printf '%s\n' "$message" >&2 + exit 1 + } +} + +assert_regex_match() { + local string=$1 regex=$2 message=$3 + + [[ $string =~ $regex ]] || { + [[ $message ]] || message="String '$string' does not match regex '$regex'" + printf '%s\n' "$message" >&2 + exit 1 + } +} + +# +# assert if variables are set +# if any variable is not set, exit 1 (when -f option is set) or return 1 otherwise +# +# Usage: assert_not_null [-f] variable ... +# +assert_not_null() { + local fatal var num_null=0 + [[ "$1" = "-f" ]] && { shift; fatal=1; } + for var in "$@"; do + [[ -z "${!var}" ]] && + printf '%s\n' "Variable '$var' not set" >&2 && + ((num_null++)) + done + + if ((num_null > 0)); then + [[ "$fatal" ]] && exit 1 + return 1 + fi + return 0 +} + +dirname2() { + local path=$1 + [[ $path =~ ^[^/]+$ ]] && dir=. || { # if path has no slashes, set dir to . + [[ $path =~ ^/+$ ]] && dir=/ || { # if path has only slashes, set dir to / + local IFS=/ dir_a i + read -ra dir_a <<< "$path" # read the components of path into an array + dir="${dir_a[0]}" + for ((i=1; i < ${#dir_a[@]}; i++)); do # strip out any repeating slashes + [[ ${dir_a[i]} ]] && dir="$dir/${dir_a[i]}" # append unless it is an empty element + done + } + } + + [[ $dir ]] && printf '%s\n' "$dir" # print only if not empty +} diff --git a/lib/stdprofile.sh b/lib/stdprofile.sh new file mode 100644 index 0000000..18d2719 --- /dev/null +++ b/lib/stdprofile.sh @@ -0,0 +1,44 @@ +# +# stdprofile.sh +# +# standard profile for Bash environments +# to be sourced in from .bashrc or .bash_profile +# + +### +### Set env variables +### +export BASE_OS=$(uname -s) +export BASE_HOST=$(hostname -s) + +### +### PATH related +### + +add_to_path() { + local dir re + + for dir; do + re="(^$dir:|:$dir:|:$dir$)" + if ! [[ $PATH =~ $re ]]; then + PATH="$PATH:$dir" + fi + done +} + +dedupe_path() { + base_debug "PATH before dedupe: [$PATH]" + PATH="$(perl -e 'print join(":", grep { not $seen{$_}++ } split(/:/, $ENV{PATH}))')" + base_debug "PATH after dedupe: [$PATH]" +} + +### +### Other functions +### + +base_update() ( + [[ -d $BASE_HOME ]] && { + cd "$BASE_HOME" + git pull --rebase + } +) diff --git a/team/test-team1/bin/test_command1 b/team/test-team1/bin/test_command1 new file mode 100644 index 0000000..fa1f68e --- /dev/null +++ b/team/test-team1/bin/test_command1 @@ -0,0 +1,3 @@ +# +# An empty command file +# diff --git a/team/test-team1/lib/bashrc b/team/test-team1/lib/bashrc new file mode 100644 index 0000000..10fa58d --- /dev/null +++ b/team/test-team1/lib/bashrc @@ -0,0 +1,3 @@ +# +# team specific bashrc file for interactive shells +# diff --git a/team/test-team1/lib/test-team1.sh b/team/test-team1/lib/test-team1.sh new file mode 100644 index 0000000..b3c160d --- /dev/null +++ b/team/test-team1/lib/test-team1.sh @@ -0,0 +1,3 @@ +# +# any team specific aliases, functions, and other settings +# diff --git a/team/test-team2/bin/test_command1 b/team/test-team2/bin/test_command1 new file mode 100644 index 0000000..fa1f68e --- /dev/null +++ b/team/test-team2/bin/test_command1 @@ -0,0 +1,3 @@ +# +# An empty command file +# diff --git a/team/test-team2/lib/bashrc b/team/test-team2/lib/bashrc new file mode 100644 index 0000000..10fa58d --- /dev/null +++ b/team/test-team2/lib/bashrc @@ -0,0 +1,3 @@ +# +# team specific bashrc file for interactive shells +# diff --git a/team/test-team2/lib/test-team2.sh b/team/test-team2/lib/test-team2.sh new file mode 100644 index 0000000..b3c160d --- /dev/null +++ b/team/test-team2/lib/test-team2.sh @@ -0,0 +1,3 @@ +# +# any team specific aliases, functions, and other settings +# diff --git a/user/test_user1.sh b/user/test_user1.sh new file mode 100644 index 0000000..43065b9 --- /dev/null +++ b/user/test_user1.sh @@ -0,0 +1,18 @@ +BASE_TEAM=test-team1 +BASE_SHARED_TEAMS=test-team2 + +import lib/base_defaults.sh + +# +# generic aliases +# +alias mv='mv -i' +alias cp='cp -i' +alias rm='rm -i' +alias h='history' +alias l='ls -ltr' + +# +# refresh base +# +base_update diff --git a/user/test_user2.sh b/user/test_user2.sh new file mode 100644 index 0000000..540f0a7 --- /dev/null +++ b/user/test_user2.sh @@ -0,0 +1,17 @@ +BASE_TEAM=test-team2 + +import lib/base_defaults.sh + +# +# generic aliases +# +alias mv='mv -i' +alias cp='cp -i' +alias rm='rm -i' +alias h='history' +alias l='ls -ltr' + +# +# refresh base +# +base_update From 15b4728d04862ec373fd865cfb709060183fe324 Mon Sep 17 00:00:00 2001 From: Ramesh Padmanabhaiah Date: Sat, 9 Mar 2019 16:12:12 -0800 Subject: [PATCH 02/84] Updated directory structure picture --- docs/img/directory_structure.png | Bin 109476 -> 119899 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/img/directory_structure.png b/docs/img/directory_structure.png index f5fd85f90df4ce864b3a8ae293d371db05cb0298..6ca70f6ff0f7f3cd94386ff3b1df2cfa71ec1327 100644 GIT binary patch literal 119899 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

A19p9M@T4H)L^)!=+X|%r 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 v@4u`Ae{uJjujAiWg!>A-H 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 Wv@#3^8Cbsu{>e!xN>+#)!~PF~W#e-I From d32525c256bfa12c500bcf591e11be7a1f1141ff Mon Sep 17 00:00:00 2001 From: codeforester Date: Thu, 21 Mar 2019 17:56:03 -0700 Subject: [PATCH 03/84] - Eliminated stdprofile.sh - Added logging functions to stdlib.sh - Moved assertions from stdlib.sh to assertions.sh - Spruced up base_init.sh; we now populate BASE_SOURCES array to indicated what all scripts were sourced in - Added base_wrapper which makes it easy to write scripts using base --- base_init.sh | 129 ++++++++++++++++++++++++------ lib/assertions.sh | 79 +++++++++++++++++++ lib/bashrc | 9 --- lib/stdlib.sh | 196 +++++++++++++++++++++++++++++----------------- 4 files changed, 307 insertions(+), 106 deletions(-) create mode 100644 lib/assertions.sh diff --git a/base_init.sh b/base_init.sh index 9f74bdf..f233c7c 100755 --- a/base_init.sh +++ b/base_init.sh @@ -2,9 +2,23 @@ # base_init.sh: top level script that should be sourced in, especially inside .bash_profile # -[[ -f $HOME/.base_debug ]] && export BASE_DEBUG=1 -base_debug() { [[ $BASE_DEBUG ]] && printf '%(%Y-%m-%d:%H:%M:%S)T %s\n' -1 "DEBUG ${BASH_SOURCE[0]}:${BASH_LINENO[1]} $@" >&2; } -base_error() { printf '%(%Y-%m-%d:%H:%M:%S)T %s\n' -1 "ERROR ${BASH_SOURCE[0]}:${BASH_LINENO[1]} $@" >&2; } +do_init() { + [[ -f $HOME/.base_debug ]] && export BASE_DEBUG=1 + [[ ! $ZSH_EVAL_CONTEXT ]] && { + base_debug() { [[ $BASE_DEBUG ]] && printf '%(%Y-%m-%d:%H:%M:%S)T %s\n' -1 "DEBUG ${BASH_SOURCE[0]}:${BASH_LINENO[1]} $@" >&2; } + base_error() { printf '%(%Y-%m-%d:%H:%M:%S)T %s\n' -1 "ERROR ${BASH_SOURCE[0]}:${BASH_LINENO[1]} $@" >&2; } + } || { + # + # for zsh - it doesn't support time in printf + # + base_debug() { [[ $BASE_DEBUG ]] && printf '%s\n' "$(date) DEBUG ${BASH_SOURCE[0]}:${BASH_LINENO[1]} $@" >&2; } + base_error() { printf '%s\n' "$(date) ERROR ${BASH_SOURCE[0]}:${BASH_LINENO[1]} $@" >&2; } + } + + export BASE_SOURCES=() + export BASE_OS=$(uname -s) + export BASE_HOST=$(hostname -s) +} set_base_home() { script=$HOME/.baserc @@ -24,18 +38,29 @@ set_base_home() { export BASE_HOME } +source_it() { + local lib iflag=0 sourced=0 + [[ $1 = "-i" ]] && { iflag=1; shift; } + lib=$1 + if ((iflag)); then + ((_interactive)) && [[ -f $lib ]] && { base_debug "(interactive) Sourcing $lib"; source "$lib"; sourced=1; } + else + [[ -f $lib ]] && { base_debug "Sourcing $lib"; source "$lib"; sourced=1; } + fi + ((sourced)) && BASE_SOURCES+=("$lib") +} + # -# source in stdprofile.sh and stdlib.sh +# source in libraries # import_libs_and_profiles() { - local lib bin team - for lib in $BASE_HOME/lib/stdprofile.sh \ - $BASE_HOME/lib/stdlib.sh; do - [[ -f $lib ]] && { base_debug "Sourcing $lib" >&2; source "$lib"; } - done + local lib script bin team + local -A teams - lib=$BASE_HOME/user/$USER.sh - [[ -f $lib ]] && ((_interactive)) && { base_debug "[interactive] Sourcing $lib" >&2; source "$lib"; } + source_it "$BASE_HOME/lib/stdlib.sh" # common library + source_it -i "$BASE_HOME/company/lib/bashrc" # company-specific bashrc for interactive shells + source_it -i "$BASE_HOME/user/$USER.sh" # user-specific bashrc for interactive shells + add_to_path "$BASE_HOME/company/bin" # add company bin to PATH # # team specific actions @@ -44,33 +69,87 @@ import_libs_and_profiles() { # For example: BASE_TEAM=teamX # # Users can also set "BASE_SHARED_TEAMS" to more teams so as to share from those teams. - # For example: BASE_SHARED_TEAMS="teamY teamZ" + # For example: BASE_SHARED_TEAMS="teamY teamZ" or + # BASE_SHARED_TEAMS=(teamY teamZ) # # We source the team specific startup script add the team bin directory to PATH, in the same order # - for team in $BASE_TEAM $BASE_SHARED_TEAMS; do - lib=$BASE_HOME/team/$team/lib/bashrc - [[ -f $lib ]] && ((_interactive)) && { base_debug "[interactive] Sourcing $lib" >&2; source "$lib"; } + teams=() + for team in $BASE_TEAM $BASE_SHARED_TEAMS ${BASE_SHARED_TEAMS[@]}; do + [[ ${teams[$team]} ]] && continue # skip if team was seen already + source_it -i "$BASE_HOME/team/$team/lib/bashrc" # team specific bashrc for interactive shells + source_it "$BASE_HOME/team/$team/lib/$team.sh" # team specific startup library + add_to_path "$BASE_HOME/team/$team/bin" # add team bin to PATH (gets priority over company bin) + teams[$team]=1 + done +} + +# +# A shortcut to refresh the base git repo +# +base_update() ( + [[ -d $BASE_HOME ]] && { + cd "$BASE_HOME" + git pull --rebase + } +) - lib=$BASE_HOME/team/$team/lib/$team.sh - [[ -f $lib ]] && { base_debug "Sourcing $lib" >&2; source "$lib"; } +# +# base_wrapper +# +# This function is meant to be called by scripts that are built on top of base. +# base_wrapper is exported so that it is visible to sub processes started from the login shell. +# It discovers base_init and sources it. It also looks at the command line arguments and interprets a few of those, +# like --debug. It calls the main function the modified argument list. The main function is expected to be defined by +# the calling script. +# +base_wrapper() { + local grab_debug=0 arg args script + [[ $1 = "-d" ]] && { grab_debug=1; shift; } + [[ $BASE_HOME ]] || { printf '%s\n' "ERROR: BASE_HOME is not set" >&2; exit 1; } + [[ -d $BASE_HOME ]] || { printf '%s\n' "ERROR: BASE_HOME '$BASE_HOME'is not a directory or is not readable" >&2; exit 1; } + script=$BASE_HOME/base_init.sh + [[ -f $script ]] || { printf '%s\n' "ERROR: base_init script '$script'is not present or is not readable" >&2; exit 1; } + source "$script" + ((grab_debug)) && { + # + # grab out '-debug' or '--debug' from argument list and set a global variable to turn on debug mode + # + for arg; do + if [[ $arg = "-debug" || $arg = "--debug" ]]; then + BASE_DEBUG=1 + elif [[ $arg = "-describe" || $arg = "--describe" ]]; then + _describe + exit $? + elif [[ $arg = "-help" || $arg = "--help" ]]; then + _help + exit $? + else + args+=("$arg") + fi + done - bin=$BASE_HOME/team/$team/bin - [[ -d $bin ]] && add_to_path "$bin" - done + set -- "${args[@]}" + } + + main "$@" } -main() { +base_main() { + do_init [[ $- = *i* ]] && _interactive=1 || _interactive=0 - set_base_home if [[ -d $BASE_HOME ]]; then import_libs_and_profiles - add_to_path "$BASE_HOME/bin" "$BASE_HOME/company/bin" - dedupe_path + add_to_path "$BASE_HOME/bin" else base_error "BASE_HOME '$BASE_HOME' is not a directory or is not accessible" fi + + # + # these functions need to be available to user's subprocesses + # + export -f base_update base_wrapper import } -main +base_main diff --git a/lib/assertions.sh b/lib/assertions.sh new file mode 100644 index 0000000..9be9eab --- /dev/null +++ b/lib/assertions.sh @@ -0,0 +1,79 @@ +## +## Assertions +## + +# +# Given a version like x.y, where x and y are numbers, asserts that +# bash version is at least x.y +# +assert_minimum_bash_version() { + local version=$1 message=$2 + local version_array curr_version version_re='^[0-9]+\.[0-9]+$' + + assert_arg_count $# 1 "Usage: assert_minimum_bash_version version" + assert_regex_match "$version" "$version_re" "Version should be in the format x.y where x and y are integers" + version_array=(${version//\./ }) + (( BASH_VERSINFO[0] < version_array[0] || + ((BASH_VERSINFO[0] == version_array[0] && BASH_VERSINFO[1] < version_array[1])))) && { + curr_version="${BASH_VERSINFO[@]:0:4}" + [[ $message ]] || message="Running with Bash version ${curr_version// /.}; need $version or above" + printf '%s\n' "$message" >&2 + exit 1 + } + return 0 +} + +# +# test code - run this to test the functions in this library +# the tests run in a sub shell and hence won't exit the main shell in case of failures +# +test_stdlib() ( + assert_minimum_bash_version "$@" +) + +# +# exit if number of arguments passed doesn't meet expectations +# example call: +# assert_arg_count $# 2 "Need exactly two arguments" +# +assert_arg_count() { + local actual=$1 expected=$2 message=$3 + + ((actual != expected)) && { + [[ $message ]] || message="Expected $expected arguments, got $actual arguments" + printf '%s\n' "$message" >&2 + exit 1 + } +} + +assert_regex_match() { + local string=$1 regex=$2 message=$3 + + [[ $string =~ $regex ]] || { + [[ $message ]] || message="String '$string' does not match regex '$regex'" + printf '%s\n' "$message" >&2 + exit 1 + } +} + +# +# assert if variables are set +# if any variable is not set, exit 1 (when -f option is set) or return 1 otherwise +# +# Usage: assert_not_null [-f] variable ... +# +assert_not_null() { + local fatal var num_null=0 + [[ "$1" = "-f" ]] && { shift; fatal=1; } + for var in "$@"; do + [[ -z "${!var}" ]] && + printf '%s\n' "Variable '$var' not set" >&2 && + ((num_null++)) + done + + if ((num_null > 0)); then + [[ "$fatal" ]] && exit 1 + return 1 + fi + return 0 +} diff --git a/lib/bashrc b/lib/bashrc index ee2d32f..b4a41b3 100644 --- a/lib/bashrc +++ b/lib/bashrc @@ -50,15 +50,6 @@ base_init() { base_error "base init script '$script' does not exist; check your git repository" return fi - - # - # source in company specific bashrc if it exists - # - script=$BASE_HOME/company/lib/bashrc - [[ -f $script ]] && { - base_debug "Sourcing $script" - source "$script" - } } base_init diff --git a/lib/stdlib.sh b/lib/stdlib.sh index 1b669c3..e96a68e 100644 --- a/lib/stdlib.sh +++ b/lib/stdlib.sh @@ -1,32 +1,61 @@ -# -# stdlib.sh - foundation library for Bash scripts -# -# we cover: -# - assertions -# - logging -# - error handling -# +### +### stdlib.sh - foundation library for Bash scripts +### # # import a library from $BASE_HOME/lib # Example: -# import lib/logging.sh company/lib/xyz.sh ... +# import lib/assertions.sh company/lib/xyz.sh ... # import() { - local lib + local lib rc=0 for lib; do lib=$BASE_HOME/$lib [[ -f "$lib" ]] && { source "$lib" } || { printf 'ERROR: %s\n' "Library '$lib' does not exist" >&2 + rc=1 } done + return $rc } -# -# Print components of $PATH, one on each line -# +## +## PATH related functions +## + +# add a new directory to $PATH +add_to_path() { + local dir re prepend=0 opt strict=1 + + OPTIND=1 + while getopts sp opt; do + case "$opt" in + n) strict=0 ;; # don't care if directory exists or not before adding it to PATH + p) prepend=1 ;; # prepend the directory to PATH instead of appending + *) log_error "add_to_path - invalid option '$opt'" + return + ;; + esac + done + + shift $((OPTIND-1)) + for dir; do + ((strict)) && [[ ! -d $dir ]] && continue + re="(^$dir:|:$dir:|:$dir$)" + if ! [[ $PATH =~ $re ]]; then + ((prepend)) && PATH="$dir:$PATH" || PATH="$PATH:$dir" + fi + done +} + +# remove duplicates in $PATH +dedupe_path() { + PATH="$(perl -e 'print join(":", grep { not $seen{$_}++ } split(/:/, $ENV{PATH}))')" +} + +# print directories in $PATH, one per line print_path() { local -a dirs local dir @@ -37,6 +66,10 @@ print_path() { done } +## +## Logging +## + dump_trace() { local frame=0 while caller "$frame"; do @@ -56,81 +89,100 @@ exit_if_error() { } # -# Given a version like x.y, where x and y are numbers, asserts that -# bash version is at least x.y +# map log level strings (FATAL, ERROR, etc.) to numeric values # -assert_minimum_bash_version() { - local version=$1 message=$2 - local version_array curr_version version_re='^[0-9]+\.[0-9]+$' - - assert_arg_count $# 1 "Usage: assert_minimum_bash_version version" - assert_regex_match "$version" "$version_re" "Version should be in the format x.y where x and y are integers" - version_array=(${version//\./ }) - (( BASH_VERSINFO[0] < version_array[0] || - ((BASH_VERSINFO[0] == version_array[0] && BASH_VERSINFO[1] < version_array[1])))) && { - curr_version="${BASH_VERSINFO[@]:0:4}" - [[ $message ]] || message="Running with Bash version ${curr_version// /.}; need $version or above" - printf '%s\n' "$message" >&2 - exit 1 - } - return 0 -} +unset _log_levels _loggers_level_map +declare -gA _log_levels _loggers_level_map +_log_levels=([FATAL]=0 [ERROR]=1 [WARN]=2 [INFO]=3 [DEBUG]=4 [VERBOSE]=5) # -# test code - run this to test the functions in this library -# the tests run in a sub shell and hence won't exit the main shell in case of failures +# hash to map loggers to their log levels +# the default logger "default" has INFO as its default log level # -test_stdlib() ( - assert_minimum_bash_version "$@" -) +_loggers_level_map["default"]=3 # the log level for the default logger is INFO # -# exit if number of arguments passed doesn't meet expectations -# example call: -# assert_arg_count $# 2 "Need exactly two arguments" +# set_log_level # -assert_arg_count() { - local actual=$1 expected=$2 message=$3 - - ((actual != expected)) && { - [[ $message ]] || message="Expected $expected arguments, got $actual arguments" - printf '%s\n' "$message" >&2 - exit 1 - } +set_log_level() { + local logger=default in_level l + [[ $1 = "-l" ]] && { logger=$2; shift 2 2>/dev/null; } + in_level="${1:-INFO}" + if [[ $logger ]]; then + l="${_log_levels[$in_level]}" + if [[ $l ]]; then + _loggers_level_map[$logger]=$l + else + printf '%(%Y-%m-%d:%H:%M:%S)T %s\n' -1 "WARN ${BASH_SOURCE[0]}:${BASH_LINENO[1]} Unknown log level '$in_level' for logger '$logger'; setting to INFO" + _loggers_level_map[$logger]=3 + fi + else + printf '%(%Y-%m-%d:%H:%M:%S)T %s\n' -1 "WARN ${BASH_SOURCE[0]}:${BASH_LINENO[1]} Option '-l' needs an argument" >&2 + fi } -assert_regex_match() { - local string=$1 regex=$2 message=$3 - - [[ $string =~ $regex ]] || { - [[ $message ]] || message="String '$string' does not match regex '$regex'" - printf '%s\n' "$message" >&2 - exit 1 - } +log_execute() { + local level=${1:-INFO} + if (( $1 >= ${_log_levels[$level]} )); then + "${@:2}" >/dev/null + else + "${@:2}" + fi } # -# assert if variables are set -# if any variable is not set, exit 1 (when -f option is set) or return 1 otherwise +# logging function # -# Usage: assert_not_null [-f] variable ... +_print_log() { + local in_level=$1; shift + local logger=default log_level_set log_level + [[ $1 = "-l" ]] && { logger=$2; shift 2; } + log_level="${_log_levels[$in_level]}" + log_level_set="${_loggers_level_map[$logger]}" + if [[ $log_level_set ]]; then + ((log_level_set >= log_level)) && printf '%(%Y-%m-%d:%H:%M:%S)T %s %s\n' -1 "$in_level ${BASH_SOURCE[2]}:${BASH_LINENO[1]}" "$@" >&2 + else + printf '%(%Y-%m-%d:%H:%M:%S)T %s\n' -1 "WARN ${BASH_SOURCE[0]}:${BASH_LINENO[1]} Unknown logger '$logger'" >&2 + fi +} + # -assert_not_null() { - local fatal var num_null=0 - [[ "$1" = "-f" ]] && { shift; fatal=1; } - for var in "$@"; do - [[ -z "${!var}" ]] && - printf '%s\n' "Variable '$var' not set" >&2 && - ((num_null++)) - done - - if ((num_null > 0)); then - [[ "$fatal" ]] && exit 1 - return 1 - fi - return 0 +# shortcut functions for each log level +# +log_fatal() { _print_log FATAL "$@"; } +log_error() { _print_log ERROR "$@"; } +log_warn() { _print_log WARN "$@"; } +log_info() { _print_log INFO "$@"; } +log_debug() { _print_log DEBUG "$@"; } +log_verbose() { _print_log VERBOSE "$@"; } + +# +# functions for logging command output +# +_print_log_file() { + local in_level=$1; shift + local logger=default log_level_set log_level file + [[ $1 = "-l" ]] && { logger=$2; shift 2; } + file=$1 + log_level="${_log_levels[$in_level]}" + log_level_set="${_loggers_level_map[$logger]}" + if [[ $log_level_set ]]; then + if ((log_level_set >= log_level)) && [[ -f $file ]]; then + log_debug "=== file output start ===" + cat "$1" + log_debug "=== file output end ===" + fi + else + printf '%(%Y-%m-%d:%H:%M:%S)T %s\n' -1 "WARN ${BASH_SOURCE[0]}:${BASH_LINENO[1]} Unknown logger '$logger'" >&2 + fi } +log_debug_file() { _print_log_file DEBUG "$@"; } +log_verbose_file() { _print_log_file VERBOSE "$@"; } + +## +## file related +## dirname2() { local path=$1 [[ $path =~ ^[^/]+$ ]] && dir=. || { # if path has no slashes, set dir to . From 0dd740973c38d88aa03002bb13b34393634f9c05 Mon Sep 17 00:00:00 2001 From: codeforester Date: Thu, 21 Mar 2019 18:23:26 -0700 Subject: [PATCH 04/84] Removed log_execute and added more comments --- lib/stdlib.sh | 40 +++++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/lib/stdlib.sh b/lib/stdlib.sh index e96a68e..6271e13 100644 --- a/lib/stdlib.sh +++ b/lib/stdlib.sh @@ -7,6 +7,9 @@ # Example: # import lib/assertions.sh company/lib/xyz.sh ... # +# IMPORTANT NOTE: If your library has global variables declared with 'declare' statement, you need to add -g flag to those. +# Since the library gets sourced inside the `import` function, globals declared without the -g option would +# local to the function and hence become unavailable to other functions. import() { local lib rc=0 for lib; do @@ -91,6 +94,8 @@ exit_if_error() { # # map log level strings (FATAL, ERROR, etc.) to numeric values # +# Note the '-g' option passed to declare - it is essential +# unset _log_levels _loggers_level_map declare -gA _log_levels _loggers_level_map _log_levels=([FATAL]=0 [ERROR]=1 [WARN]=2 [INFO]=3 [DEBUG]=4 [VERBOSE]=5) @@ -121,17 +126,8 @@ set_log_level() { fi } -log_execute() { - local level=${1:-INFO} - if (( $1 >= ${_log_levels[$level]} )); then - "${@:2}" >/dev/null - else - "${@:2}" - fi -} - # -# logging function +# core logging function # _print_log() { local in_level=$1; shift @@ -147,17 +143,7 @@ _print_log() { } # -# shortcut functions for each log level -# -log_fatal() { _print_log FATAL "$@"; } -log_error() { _print_log ERROR "$@"; } -log_warn() { _print_log WARN "$@"; } -log_info() { _print_log INFO "$@"; } -log_debug() { _print_log DEBUG "$@"; } -log_verbose() { _print_log VERBOSE "$@"; } - -# -# functions for logging command output +# core function for logging contents of a file # _print_log_file() { local in_level=$1; shift @@ -177,6 +163,18 @@ _print_log_file() { fi } +# +# shortcut functions for each log level +# +log_fatal() { _print_log FATAL "$@"; } +log_error() { _print_log ERROR "$@"; } +log_warn() { _print_log WARN "$@"; } +log_info() { _print_log INFO "$@"; } +log_debug() { _print_log DEBUG "$@"; } +log_verbose() { _print_log VERBOSE "$@"; } +# +# shortcut functions for logging files +# log_debug_file() { _print_log_file DEBUG "$@"; } log_verbose_file() { _print_log_file VERBOSE "$@"; } From c4276dc7ffc2e47bbd263689481f396e1850b985 Mon Sep 17 00:00:00 2001 From: codeforester Date: Thu, 21 Mar 2019 18:34:11 -0700 Subject: [PATCH 05/84] Added sample body of the script with logging and invocation of base_wrapper --- company/bin/test_command1 | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/company/bin/test_command1 b/company/bin/test_command1 index affcdff..a18a5e9 100755 --- a/company/bin/test_command1 +++ b/company/bin/test_command1 @@ -1,3 +1,10 @@ # # test command # +main() { + log_info "Starting" + # do something + log_info "Finished" +} + +base_wrapper "$@" || { printf '%s\n' "ERROR: base environment not initialized; make sure you have sourced base_init.sh before invoking this script" >&2; exit 1; } From 6d9bf02c74d9426ce5d50bc47e3e6dcb831acb39 Mon Sep 17 00:00:00 2001 From: codeforester Date: Thu, 21 Mar 2019 18:36:20 -0700 Subject: [PATCH 06/84] Added sample code to test scripts in teams' bin directory --- team/test-team1/bin/test_command1 | 9 ++++++++- team/test-team2/bin/test_command1 | 9 ++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/team/test-team1/bin/test_command1 b/team/test-team1/bin/test_command1 index fa1f68e..701eff8 100644 --- a/team/test-team1/bin/test_command1 +++ b/team/test-team1/bin/test_command1 @@ -1,3 +1,10 @@ # -# An empty command file +# test command for team # +main() { + log_info "Starting" + # do something + log_info "Finished" +} + +base_wrapper "$@" || { printf '%s\n' "ERROR: base environment not initialized; make sure you have sourced base_init.sh before invoking this script" >&2; exit 1; } diff --git a/team/test-team2/bin/test_command1 b/team/test-team2/bin/test_command1 index fa1f68e..701eff8 100644 --- a/team/test-team2/bin/test_command1 +++ b/team/test-team2/bin/test_command1 @@ -1,3 +1,10 @@ # -# An empty command file +# test command for team # +main() { + log_info "Starting" + # do something + log_info "Finished" +} + +base_wrapper "$@" || { printf '%s\n' "ERROR: base environment not initialized; make sure you have sourced base_init.sh before invoking this script" >&2; exit 1; } From 9d6e0c31a7f10651bf4f3bf68c44b914f7a94025 Mon Sep 17 00:00:00 2001 From: codeforester Date: Fri, 22 Mar 2019 15:42:25 -0700 Subject: [PATCH 07/84] Moved dirname2 to file.sh and corrected some typos --- lib/file.sh | 18 ++++++++++++++++++ lib/stdlib.sh | 23 ++--------------------- 2 files changed, 20 insertions(+), 21 deletions(-) create mode 100644 lib/file.sh diff --git a/lib/file.sh b/lib/file.sh new file mode 100644 index 0000000..95e3aef --- /dev/null +++ b/lib/file.sh @@ -0,0 +1,18 @@ +## +## file related functions +## +dirname2() { + local path=$1 + [[ $path =~ ^[^/]+$ ]] && dir=. || { # if path has no slashes, set dir to . + [[ $path =~ ^/+$ ]] && dir=/ || { # if path has only slashes, set dir to / + local IFS=/ dir_a i + read -ra dir_a <<< "$path" # read the components of path into an array + dir="${dir_a[0]}" + for ((i=1; i < ${#dir_a[@]}; i++)); do # strip out any repeating slashes + [[ ${dir_a[i]} ]] && dir="$dir/${dir_a[i]}" # append unless it is an empty element + done + } + } + + [[ $dir ]] && printf '%s\n' "$dir" # print only if not empty +} diff --git a/lib/stdlib.sh b/lib/stdlib.sh index 6271e13..6661801 100644 --- a/lib/stdlib.sh +++ b/lib/stdlib.sh @@ -3,13 +3,13 @@ ### # -# import a library from $BASE_HOME/lib +# import a library from $BASE_HOME # Example: # import lib/assertions.sh company/lib/xyz.sh ... # # IMPORTANT NOTE: If your library has global variables declared with 'declare' statement, you need to add -g flag to those. # Since the library gets sourced inside the `import` function, globals declared without the -g option would -# local to the function and hence become unavailable to other functions. +# be local to the function and hence be unavailable to other functions. import() { local lib rc=0 for lib; do @@ -177,22 +177,3 @@ log_verbose() { _print_log VERBOSE "$@"; } # log_debug_file() { _print_log_file DEBUG "$@"; } log_verbose_file() { _print_log_file VERBOSE "$@"; } - -## -## file related -## -dirname2() { - local path=$1 - [[ $path =~ ^[^/]+$ ]] && dir=. || { # if path has no slashes, set dir to . - [[ $path =~ ^/+$ ]] && dir=/ || { # if path has only slashes, set dir to / - local IFS=/ dir_a i - read -ra dir_a <<< "$path" # read the components of path into an array - dir="${dir_a[0]}" - for ((i=1; i < ${#dir_a[@]}; i++)); do # strip out any repeating slashes - [[ ${dir_a[i]} ]] && dir="$dir/${dir_a[i]}" # append unless it is an empty element - done - } - } - - [[ $dir ]] && printf '%s\n' "$dir" # print only if not empty -} From 71f80f7dc759981a12d30b718a0cc753be92cb06 Mon Sep 17 00:00:00 2001 From: codeforester Date: Fri, 22 Mar 2019 15:56:31 -0700 Subject: [PATCH 08/84] Updated FAQ --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index d6b5840..232983a 100644 --- a/README.md +++ b/README.md @@ -66,10 +66,19 @@ You need to do this on every host where you want base. ## I don't want to keep my personal settings private, and not in git. What should I do? + Do one of the following: + * write a one-liner in `user/.sh` like this: source /path/to/your.settings + * add the following code to your .bashrc: + + export BASE_HOME=/path/to/base + source "$BASE_HOME/base_init.sh" + + In both these cases, you need to manage your files manually, outside git. + ## I do want to use the default settings. What should I do? Add this to your `user/.sh` file: From 0098f71c49f57b0d432e976c4dd7b26a828d0ec6 Mon Sep 17 00:00:00 2001 From: codeforester Date: Fri, 22 Mar 2019 22:11:00 -0700 Subject: [PATCH 09/84] Removed stdprofile.sh --- README.md | 2 +- lib/stdprofile.sh | 44 -------------------------------------------- 2 files changed, 1 insertion(+), 45 deletions(-) delete mode 100644 lib/stdprofile.sh diff --git a/README.md b/README.md index 232983a..70ed186 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ Here is the code: In a typical setting `.bashrc` sources in `$BASE_HOME/base_init.sh` which does the following: -* sources in `lib/stdprofile.sh`, `lib/stdlib.sh`, and `user/.sh` if it exists, in that order +* sources in `lib/stdlib.sh`, and `user/.sh` if it exists, in that order * updates `$PATH` to include the relevant `bin` directories * `$BASE_HOME/company/bin` is always added * `$BASE_HOME/team/$BASE_TEAM/bin` is added if `$BASE_TEAM` is set in `user/.sh` diff --git a/lib/stdprofile.sh b/lib/stdprofile.sh deleted file mode 100644 index 18d2719..0000000 --- a/lib/stdprofile.sh +++ /dev/null @@ -1,44 +0,0 @@ -# -# stdprofile.sh -# -# standard profile for Bash environments -# to be sourced in from .bashrc or .bash_profile -# - -### -### Set env variables -### -export BASE_OS=$(uname -s) -export BASE_HOST=$(hostname -s) - -### -### PATH related -### - -add_to_path() { - local dir re - - for dir; do - re="(^$dir:|:$dir:|:$dir$)" - if ! [[ $PATH =~ $re ]]; then - PATH="$PATH:$dir" - fi - done -} - -dedupe_path() { - base_debug "PATH before dedupe: [$PATH]" - PATH="$(perl -e 'print join(":", grep { not $seen{$_}++ } split(/:/, $ENV{PATH}))')" - base_debug "PATH after dedupe: [$PATH]" -} - -### -### Other functions -### - -base_update() ( - [[ -d $BASE_HOME ]] && { - cd "$BASE_HOME" - git pull --rebase - } -) From 774a3b8f144d01084e4a2910ed6a1166a940fa68 Mon Sep 17 00:00:00 2001 From: codeforester Date: Tue, 26 Mar 2019 22:57:55 -0700 Subject: [PATCH 10/84] Added test cases for logging functions --- test/test_stdlib.sh | 53 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100755 test/test_stdlib.sh diff --git a/test/test_stdlib.sh b/test/test_stdlib.sh new file mode 100755 index 0000000..c25fb05 --- /dev/null +++ b/test/test_stdlib.sh @@ -0,0 +1,53 @@ +import lib/stdlib.sh + +test_log_func() { + local level=$1 func=$2 expected=$3 log rc=0 + set_log_level "$level" + log=$(log_$func "test $level" 2>&1) + if ((expected)) && ! [[ $log ]]; then + printf 'Log level %-7s function %-11s: %s\n' "$level" "log_$func" FAIL + ((fail++)) + else + ((verbose)) && printf 'Log level %-7s function %-11s: %s\n' "$level" "log_$func" SUCCESS + fi +} + +test_logging() { + local rc + + fail=0 verbose=0 rc=0 + test_log_func ERROR error 1 + test_log_func ERROR warn 0 + test_log_func ERROR info 0 + test_log_func ERROR debug 0 + test_log_func ERROR verbose 0 + + test_log_func WARN error 1 + test_log_func WARN warn 1 + test_log_func WARN info 0 + test_log_func WARN debug 0 + test_log_func WARN verbose 0 + + test_log_func INFO error 1 + test_log_func INFO warn 1 + test_log_func INFO info 1 + test_log_func INFO debug 0 + test_log_func INFO verbose 0 + + test_log_func DEBUG error 1 + test_log_func DEBUG warn 1 + test_log_func DEBUG info 1 + test_log_func DEBUG debug 1 + test_log_func DEBUG verbose 0 + + test_log_func VERBOSE error 1 + test_log_func VERBOSE warn 1 + test_log_func VERBOSE info 1 + test_log_func VERBOSE debug 1 + test_log_func VERBOSE verbose 1 + + ((fail)) && rc=1 + exit $rc +} + +test_logging From 01fa662cfeca01e184523f81bf6b171960f45665 Mon Sep 17 00:00:00 2001 From: codeforester Date: Tue, 26 Mar 2019 22:59:08 -0700 Subject: [PATCH 11/84] Grouped the functions based on their functionality --- lib/stdlib.sh | 79 ++++++++++++++++++++++++++++----------------------- 1 file changed, 43 insertions(+), 36 deletions(-) diff --git a/lib/stdlib.sh b/lib/stdlib.sh index 6661801..37a2028 100644 --- a/lib/stdlib.sh +++ b/lib/stdlib.sh @@ -1,9 +1,14 @@ ### ### stdlib.sh - foundation library for Bash scripts ### +### Areas covered: +### - PATH manipulation +### - error handling +### - logging +### # -# import a library from $BASE_HOME +# import: source a library from $BASE_HOME # Example: # import lib/assertions.sh company/lib/xyz.sh ... # @@ -12,26 +17,26 @@ # be local to the function and hence be unavailable to other functions. import() { local lib rc=0 + [[ $BASE_HOME ]] || { printf '%s\n' "ERROR: BASE_HOME not set; import functionality needs it" >&2; return 1; } for lib; do lib=$BASE_HOME/$lib - [[ -f "$lib" ]] && { + if [[ -f "$lib" ]]; then source "$lib" - } || { + else printf 'ERROR: %s\n' "Library '$lib' does not exist" >&2 rc=1 - } + fi done return $rc } -## +######################################################################################################################## ## PATH related functions -## +######################################################################################################################## # add a new directory to $PATH add_to_path() { local dir re prepend=0 opt strict=1 - OPTIND=1 while getopts sp opt; do case "$opt" in @@ -54,42 +59,18 @@ add_to_path() { } # remove duplicates in $PATH -dedupe_path() { - PATH="$(perl -e 'print join(":", grep { not $seen{$_}++ } split(/:/, $ENV{PATH}))')" -} +dedupe_path() { PATH="$(perl -e 'print join(":", grep { not $seen{$_}++ } split(/:/, $ENV{PATH}))')"; } # print directories in $PATH, one per line print_path() { - local -a dirs - local dir - + local -a dirs; local dir IFS=: read -ra dirs <<< "$PATH" - for dir in "${dirs[@]}"; do - printf '%s\n' "$dir" - done + for dir in "${dirs[@]}"; do printf '%s\n' "$dir"; done } -## +######################################################################################################################## ## Logging -## - -dump_trace() { - local frame=0 - while caller "$frame"; do - ((frame++)) - done - printf '%s\n' "$@" -} - -exit_if_error() { - (($#)) || return - local num_re='^[0-9]+' - local rc=$1; shift - [[ $rc =~ $num_re ]] || return - ((rc)) && { - dump_trace "$@" - } -} +######################################################################################################################## # # map log level strings (FATAL, ERROR, etc.) to numeric values @@ -177,3 +158,29 @@ log_verbose() { _print_log VERBOSE "$@"; } # log_debug_file() { _print_log_file DEBUG "$@"; } log_verbose_file() { _print_log_file VERBOSE "$@"; } + +######################################################################################################################## +## Error handling +######################################################################################################################## + +dump_trace() { + local frame=0 + while caller "$frame"; do + ((frame++)) + done + printf '%s\n' "$@" +} + +exit_if_error() { + (($#)) || return + local num_re='^[0-9]+' + local rc=$1; shift + local message="$@" + [[ $rc =~ $num_re ]] || return + ((rc)) && { + log_error "$message" + dump_trace "$@" + exit $rc + } +} + From b87f8a575b86070fbf2aedba048eb6c51375b163 Mon Sep 17 00:00:00 2001 From: codeforester Date: Wed, 27 Mar 2019 11:50:13 -0700 Subject: [PATCH 12/84] Added .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e43b0f9 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.DS_Store From bf0ceba7fb5a1d2cc91cbbc32b4f942150f99d6b Mon Sep 17 00:00:00 2001 From: codeforester Date: Wed, 27 Mar 2019 11:52:28 -0700 Subject: [PATCH 13/84] Added a comment --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index e43b0f9..4cf7328 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ +# Ignore macOS DS_Store files .DS_Store From 7d7213afadd8f4bbbcc1445d098cfb489f7c962f Mon Sep 17 00:00:00 2001 From: codeforester Date: Thu, 28 Mar 2019 11:09:31 -0700 Subject: [PATCH 14/84] Added a check to make sure the interpreter is Bash or zsh --- base_init.sh | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/base_init.sh b/base_init.sh index f233c7c..757cd77 100755 --- a/base_init.sh +++ b/base_init.sh @@ -3,21 +3,27 @@ # do_init() { + local rc=0 [[ -f $HOME/.base_debug ]] && export BASE_DEBUG=1 - [[ ! $ZSH_EVAL_CONTEXT ]] && { + if [[ $BASH ]]; then + # Bash base_debug() { [[ $BASE_DEBUG ]] && printf '%(%Y-%m-%d:%H:%M:%S)T %s\n' -1 "DEBUG ${BASH_SOURCE[0]}:${BASH_LINENO[1]} $@" >&2; } base_error() { printf '%(%Y-%m-%d:%H:%M:%S)T %s\n' -1 "ERROR ${BASH_SOURCE[0]}:${BASH_LINENO[1]} $@" >&2; } - } || { + elif [[ $ZSH_VERSION ]]; then # # for zsh - it doesn't support time in printf # base_debug() { [[ $BASE_DEBUG ]] && printf '%s\n' "$(date) DEBUG ${BASH_SOURCE[0]}:${BASH_LINENO[1]} $@" >&2; } base_error() { printf '%s\n' "$(date) ERROR ${BASH_SOURCE[0]}:${BASH_LINENO[1]} $@" >&2; } - } + else + printf '%s\n' "ERROR: Unsupported shell - need Bash or zsh" >&2 + rc=1 + fi export BASE_SOURCES=() export BASE_OS=$(uname -s) export BASE_HOST=$(hostname -s) + return $rc } set_base_home() { @@ -136,7 +142,7 @@ base_wrapper() { } base_main() { - do_init + do_init || return $? [[ $- = *i* ]] && _interactive=1 || _interactive=0 set_base_home if [[ -d $BASE_HOME ]]; then From 97f4b504f78189123d1e005d07474e38e286f72d Mon Sep 17 00:00:00 2001 From: codeforester Date: Thu, 28 Mar 2019 22:20:57 -0700 Subject: [PATCH 15/84] Added more documentation --- base_init.sh | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/base_init.sh b/base_init.sh index 757cd77..1d73dd7 100755 --- a/base_init.sh +++ b/base_init.sh @@ -1,5 +1,7 @@ # -# base_init.sh: top level script that should be sourced in, especially inside .bash_profile +# base_init.sh: top level script that should be sourced in by login/interactive shells +# +# lib/bashrce invokes this # do_init() { @@ -44,6 +46,11 @@ set_base_home() { export BASE_HOME } +# +# check for existence of the library, source it, add its name to BASE_SOURCES array +# Usage: source_it [-i] library_file +# -i - source only if the shell is interactive +# source_it() { local lib iflag=0 sourced=0 [[ $1 = "-i" ]] && { iflag=1; shift; } @@ -57,7 +64,7 @@ source_it() { } # -# source in libraries +# source in libraries, starting from the top (lowest precedence) to the bottom (highest precedence) # import_libs_and_profiles() { local lib script bin team @@ -91,7 +98,8 @@ import_libs_and_profiles() { } # -# A shortcut to refresh the base git repo +# A shortcut to refresh the base git repo; users can add it to user/.sh file so that base is automatically +# updated upon login. # base_update() ( [[ -d $BASE_HOME ]] && { @@ -158,4 +166,7 @@ base_main() { export -f base_update base_wrapper import } +# +# start here +# base_main From 9ba13d9e585d85c50471c88b92f1b9e050bde0c8 Mon Sep 17 00:00:00 2001 From: codeforester Date: Sat, 30 Mar 2019 13:47:55 -0700 Subject: [PATCH 16/84] Improved the formatting of stack trace in dump_trace function --- lib/stdlib.sh | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/stdlib.sh b/lib/stdlib.sh index 37a2028..7668465 100644 --- a/lib/stdlib.sh +++ b/lib/stdlib.sh @@ -164,21 +164,25 @@ log_verbose_file() { _print_log_file VERBOSE "$@"; } ######################################################################################################################## dump_trace() { - local frame=0 + local frame=0 line func source n=0 while caller "$frame"; do ((frame++)) + done | while read line func source; do + ((n++ == 0)) && { + printf 'Encountered a fatal error\n' + } + printf '%4s at %s\n' " " "$func ($source:$line)" done - printf '%s\n' "$@" } exit_if_error() { (($#)) || return local num_re='^[0-9]+' local rc=$1; shift - local message="$@" + local message="${@:-No message specified}" [[ $rc =~ $num_re ]] || return ((rc)) && { - log_error "$message" + log_fatal "$message" dump_trace "$@" exit $rc } From 188f7dd158d86508a20d153f849bc4d6b0b906b8 Mon Sep 17 00:00:00 2001 From: codeforester Date: Sat, 30 Mar 2019 15:09:07 -0700 Subject: [PATCH 17/84] Put all the code in functions so that variables can be local --- lib/bash_profile | 42 +++++++++++++++++++++++++++--------------- lib/bashrc | 30 ++++++++++++++++++++---------- 2 files changed, 47 insertions(+), 25 deletions(-) diff --git a/lib/bash_profile b/lib/bash_profile index e0242a2..00d9ae1 100644 --- a/lib/bash_profile +++ b/lib/bash_profile @@ -2,27 +2,39 @@ # .bash_profile # -[[ -f $HOME/.base_debug ]] && export BASE_DEBUG=1 -base_debug() { [[ $BASE_DEBUG ]] && printf '%(%Y-%m-%d:%H:%M:%S)T %s\n' -1 "DEBUG ${BASH_SOURCE[0]}:$LINENO $@" >&2; } - -base_debug "Running .bash_profile" +do_init() { + [[ -f $HOME/.base_debug ]] && export BASE_DEBUG=1 + base_debug() { + [[ $BASE_DEBUG ]] && + printf '%(%Y-%m-%d:%H:%M:%S)T %s\n' -1 "DEBUG ${BASH_SOURCE[0]}:$LINENO $@" >&2 + } + base_debug "Running .bash_profile" +} # # Source global profile # -if shopt -q login_shell; then - global_profile=/etc/profile - if [ -f $global_profile ]; then - base_debug "Sourcing $global_profile" - source "$global_profile" +source_global_profile() { + if shopt -q login_shell; then + local global_profile=/etc/profile + if [[ -f $global_profile ]]; then + base_debug "Sourcing $global_profile" + source "$global_profile" + fi fi -fi +} # # Source .bashrc # -bashrc=$HOME/.bashrc -if [ -f $bashrc ]; then - base_debug "Invoking $bashrc from .bash_profile" - source "$bashrc" -fi +source_bashrc() { + local bashrc=$HOME/.bashrc + if [[ -f $bashrc ]]; then + base_debug "Invoking $bashrc from .bash_profile" + source "$bashrc" + fi +} + +do_init +source_global_profile +source_bashrc diff --git a/lib/bashrc b/lib/bashrc index b4a41b3..ee3ef8d 100644 --- a/lib/bashrc +++ b/lib/bashrc @@ -2,24 +2,32 @@ # .bashrc # -[[ -f $HOME/.base_debug ]] && export BASE_DEBUG=1 -base_debug() { [[ $BASE_DEBUG ]] && printf '%(%Y-%m-%d:%H:%M:%S)T %s\n' -1 "DEBUG ${BASH_SOURCE[0]} $@" >&2; } -base_error() { printf '%(%Y-%m-%d:%H:%M:%S)T %s\n' -1 "ERROR ${BASH_SOURCE[0]} $@" >&2; } -base_debug "Running .bashrc" +do_init() { + [[ -f $HOME/.base_debug ]] && export BASE_DEBUG=1 + base_debug() { + [[ $BASE_DEBUG ]] && + printf '%(%Y-%m-%d:%H:%M:%S)T %s\n' -1 "DEBUG ${BASH_SOURCE[0]} $@" >&2 + } + base_error() { + printf '%(%Y-%m-%d:%H:%M:%S)T %s\n' -1 "ERROR ${BASH_SOURCE[0]} $@" >&2 + } + base_debug "Running .bashrc" +} # # Source global bashrc # -global_bashrc=/etc/bashrc -if [ -f $global_bashrc ]; then - base_debug "Sourcing $global_bashrc" - source "$global_bashrc" -fi +global_init() { + local global_bashrc=/etc/bashrc + if [[ -f $global_bashrc ]]; then + base_debug "Sourcing $global_bashrc" + source "$global_bashrc" + fi +} # # base stuff # - base_init() { local script @@ -52,4 +60,6 @@ base_init() { fi } +do_init +global_init base_init From ee98dec611a62dae516401a6fa029d006bc3c7bd Mon Sep 17 00:00:00 2001 From: codeforester Date: Sat, 30 Mar 2019 16:36:22 -0700 Subject: [PATCH 18/84] Handle multiline log strings gracefully --- lib/stdlib.sh | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/stdlib.sh b/lib/stdlib.sh index 7668465..3a67356 100644 --- a/lib/stdlib.sh +++ b/lib/stdlib.sh @@ -117,9 +117,12 @@ _print_log() { log_level="${_log_levels[$in_level]}" log_level_set="${_loggers_level_map[$logger]}" if [[ $log_level_set ]]; then - ((log_level_set >= log_level)) && printf '%(%Y-%m-%d:%H:%M:%S)T %s %s\n' -1 "$in_level ${BASH_SOURCE[2]}:${BASH_LINENO[1]}" "$@" >&2 + ((log_level_set >= log_level)) && { + printf '%(%Y-%m-%d:%H:%M:%S)T %s %s' -1 "$in_level ${BASH_SOURCE[2]}:${BASH_LINENO[1]}" + printf '%s\n' "$@" + } else - printf '%(%Y-%m-%d:%H:%M:%S)T %s\n' -1 "WARN ${BASH_SOURCE[0]}:${BASH_LINENO[1]} Unknown logger '$logger'" >&2 + printf '%(%Y-%m-%d:%H:%M:%S)T %s\n' -1 "WARN ${BASH_SOURCE[0]}:${BASH_LINENO[1]} Unknown logger '$logger'" fi } @@ -140,7 +143,7 @@ _print_log_file() { log_debug "=== file output end ===" fi else - printf '%(%Y-%m-%d:%H:%M:%S)T %s\n' -1 "WARN ${BASH_SOURCE[0]}:${BASH_LINENO[1]} Unknown logger '$logger'" >&2 + printf '%(%Y-%m-%d:%H:%M:%S)T %s\n' -1 "WARN ${BASH_SOURCE[0]}:${BASH_LINENO[1]} Unknown logger '$logger'" fi } From 5ebc7ebbb96776f077b1b4614a9004e012ee511d Mon Sep 17 00:00:00 2001 From: codeforester Date: Sat, 30 Mar 2019 17:12:12 -0700 Subject: [PATCH 19/84] Added more details --- README.md | 62 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 33 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index 70ed186..3a9c1c2 100644 --- a/README.md +++ b/README.md @@ -1,25 +1,27 @@ # **What is Base?** -Base is a way for Bash users to organize the following across multiple hosts: +Base is a sharing platform for shell settings, libraries, and light-weight tools. It gives a structured way for Bash users to organize the following across multiple hosts: * .bash_profile * .bashrc * generic Bash libraries and commands -* company specific Bash libraries and commands -* team specific Bash libraries and commands +* company specific Bash libraries, commands, and configuration +* team specific Bash libraries, commands, and configuration * user specific settings (aliases, functions, Bash settings) -* share Bash libraries and commands across teams +* Bash libraries, commands, and configuration that are shared across teams + +It can benefit anyone who engages with Mac/Linux command line to get things done. # **How can I get set up?** -You can get set up in a very short time. Essentially, this is what you have to do: +Set up is easy. Essentially, this is what you have to do: -* Check out Base. The standard convention is $HOME/git/base. In case your git directory is elsewhere, symlink it to `$HOME/git`. -* Consolidate your profile specifics from your current `.bash_profile` and `.bashrc` into `.sh` file. Place this file under `base/user` directory. +* Check out Base. The standard convention is $HOME/git/base. In case your git directory is elsewhere, symlink it to `$HOME/git` or specify the path by setting `BASE_HOME` in `$HOME/.baserc` file. +* Consolidate your individual settings from your current `.bash_profile` and `.bashrc` into `$USER.sh` file. Place this file under `base/user` directory and check it in to git. * Make a backup of your `.bash_profile`. Replace this file with a symlink to `base/lib/bash_profile`. * Make a backup of your `.bashrc`. Replace this file with a symlink to `base/lib/bashrc`. -Here is the code: +Here is an example: cd $HOME mkdir git && cd git @@ -27,16 +29,25 @@ Here is the code: cd $HOME mv .bash_profile .bash_profile.safe && ln -sf $HOME/git/base/lib/bash_profile .bash_profile mv .bashrc .bashrc.safe && ln -sf $HOME/git/base/lib/bashrc .bashrc - + cp $USER.sh $HOME/git/base/user + cd $HOME/git/base + git add user/$USER.sh + git commit -m "Adding the initial version of $USER.sh" + git push + # **How does Base work?** In a typical setting `.bashrc` sources in `$BASE_HOME/base_init.sh` which does the following: -* sources in `lib/stdlib.sh`, and `user/.sh` if it exists, in that order -* updates `$PATH` to include the relevant `bin` directories +* source in `lib/stdlib.sh` +* source in `company/lib/bashrc` if it exists, if the shell is interactive +* source in `user/$USER.sh` if it exists and if the shell is interactive +* source in team specific bashrc from team//lib/bashrc for each team defined in BASE_TEAM and BASE_SHARED_TEAMS variables, if the shell is interactive +* source in team specific library from team//lib/ for each team defined in BASE_TEAM and BASE_SHARED_TEAMS variables +* update `$PATH` to include the relevant `bin` directories * `$BASE_HOME/company/bin` is always added - * `$BASE_HOME/team/$BASE_TEAM/bin` is added if `$BASE_TEAM` is set in `user/.sh` - * `$BASE_HOME/team/$BASE_TEAM/bin` is added for each team defined in `$BASE_SHARED_TEAMS` (space-separated string), set in `user/.sh` + * `$BASE_HOME/team/$BASE_TEAM/bin` is added if `$BASE_TEAM` is set in `user/$USER.sh` + * `$BASE_HOME/team/$BASE_TEAM/bin` is added for each team defined in `$BASE_SHARED_TEAMS` (space-separated string), set in `user/$USER.sh` # **Directory structure** @@ -50,44 +61,37 @@ In a typical setting `.bashrc` sources in `$BASE_HOME/base_init.sh` which does t * BASE_SHARED_TEAMS * BASE_OS * BASE_HOST +* BASE_SOURCES # **FAQ** ## My git location is not `$HOME/git/base`. What should I do? You can either - * specify your base location in `$HOME/.baserc`, like + +* specify your base location in `$HOME/.baserc`, like - BASE_HOME=/path/to/base + BASE_HOME=/path/to/base - * symlink `$HOME/git/base` to the right place +* symlink `$HOME/git/base` to the right place You need to do this on every host where you want base. ## I don't want to keep my personal settings private, and not in git. What should I do? - Do one of the following: - - * write a one-liner in `user/.sh` like this: - - source /path/to/your.settings - - * add the following code to your .bashrc: - - export BASE_HOME=/path/to/base - source "$BASE_HOME/base_init.sh" +* write a one-liner in `user/$USER.sh` like this: - In both these cases, you need to manage your files manually, outside git. + source /path/to/your.settings ## I do want to use the default settings. What should I do? -Add this to your `user/.sh` file: +Add this to your `user/$USER.sh` file: import lib/base_defaults.sh ## I want to make sure I keep my base repository updated always. How can I do it? -Add this to your `user/.sh` file: +Add this to your `user/$USER.sh` file: base_update From 2801d63daeb6669a4d659cc26dfd1f46abadf981 Mon Sep 17 00:00:00 2001 From: codeforester Date: Sat, 30 Mar 2019 17:14:49 -0700 Subject: [PATCH 20/84] Fixed shellcheck warnings --- base_init.sh | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/base_init.sh b/base_init.sh index 1d73dd7..555f0ad 100755 --- a/base_init.sh +++ b/base_init.sh @@ -1,7 +1,9 @@ +#!/usr/bin/env bash + # # base_init.sh: top level script that should be sourced in by login/interactive shells # -# lib/bashrce invokes this +# lib/bashrc invokes this # do_init() { @@ -22,16 +24,17 @@ do_init() { rc=1 fi - export BASE_SOURCES=() - export BASE_OS=$(uname -s) - export BASE_HOST=$(hostname -s) + BASE_OS=$(uname -s) + BASE_HOST=$(hostname -s) + export BASE_SOURCES=() BASE_OS BASE_HOST return $rc } set_base_home() { script=$HOME/.baserc - [[ -f $script ]] && [[ ! $_baserc_sourced ]] && { + [[ -f $script ]] && [[ -z $_baserc_sourced ]] && { base_debug "Sourcing $script" + # shellcheck source=/dev/null source "$script" _baserc_sourced=1 } @@ -56,8 +59,10 @@ source_it() { [[ $1 = "-i" ]] && { iflag=1; shift; } lib=$1 if ((iflag)); then + # shellcheck source=/dev/null ((_interactive)) && [[ -f $lib ]] && { base_debug "(interactive) Sourcing $lib"; source "$lib"; sourced=1; } else + # shellcheck source=/dev/null [[ -f $lib ]] && { base_debug "Sourcing $lib"; source "$lib"; sourced=1; } fi ((sourced)) && BASE_SOURCES+=("$lib") @@ -67,13 +72,13 @@ source_it() { # source in libraries, starting from the top (lowest precedence) to the bottom (highest precedence) # import_libs_and_profiles() { - local lib script bin team + local lib script team local -A teams source_it "$BASE_HOME/lib/stdlib.sh" # common library source_it -i "$BASE_HOME/company/lib/bashrc" # company-specific bashrc for interactive shells source_it -i "$BASE_HOME/user/$USER.sh" # user-specific bashrc for interactive shells - add_to_path "$BASE_HOME/company/bin" # add company bin to PATH + add_to_path "$BASE_HOME/company/bin" # add company bin to PATH # # team specific actions @@ -88,7 +93,7 @@ import_libs_and_profiles() { # We source the team specific startup script add the team bin directory to PATH, in the same order # teams=() - for team in $BASE_TEAM $BASE_SHARED_TEAMS ${BASE_SHARED_TEAMS[@]}; do + for team in $BASE_TEAM $BASE_SHARED_TEAMS "${BASE_SHARED_TEAMS[@]}"; do [[ ${teams[$team]} ]] && continue # skip if team was seen already source_it -i "$BASE_HOME/team/$team/lib/bashrc" # team specific bashrc for interactive shells source_it "$BASE_HOME/team/$team/lib/$team.sh" # team specific startup library @@ -103,8 +108,7 @@ import_libs_and_profiles() { # base_update() ( [[ -d $BASE_HOME ]] && { - cd "$BASE_HOME" - git pull --rebase + cd "$BASE_HOME" && git pull --rebase } ) @@ -124,6 +128,7 @@ base_wrapper() { [[ -d $BASE_HOME ]] || { printf '%s\n' "ERROR: BASE_HOME '$BASE_HOME'is not a directory or is not readable" >&2; exit 1; } script=$BASE_HOME/base_init.sh [[ -f $script ]] || { printf '%s\n' "ERROR: base_init script '$script'is not present or is not readable" >&2; exit 1; } + # shellcheck source=/dev/null source "$script" ((grab_debug)) && { # From a53ec01108b3ecf9c183d8049ec6c40b4a910f8a Mon Sep 17 00:00:00 2001 From: codeforester Date: Sat, 30 Mar 2019 22:28:56 -0700 Subject: [PATCH 21/84] Added fatal_error; changed exit_if_error to handle non-numeric exit code as 1 --- lib/stdlib.sh | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/stdlib.sh b/lib/stdlib.sh index 3a67356..cbcd873 100644 --- a/lib/stdlib.sh +++ b/lib/stdlib.sh @@ -183,7 +183,10 @@ exit_if_error() { local num_re='^[0-9]+' local rc=$1; shift local message="${@:-No message specified}" - [[ $rc =~ $num_re ]] || return + if ! [[ $rc =~ $num_re ]]; then + log_error "'$rc' is not a valid exit code; it needs to be a number greater than zero. Treating it as 1." + rc=1 + fi ((rc)) && { log_fatal "$message" dump_trace "$@" @@ -191,3 +194,8 @@ exit_if_error() { } } +fatal_error() { + local ec=$? # grab the current exit code + ((ec == 0)) && ec=1 # if it is zero, set exit code to 1 + exit_if_error "$ec" "$@" +} From 9040b1e933526df535dc7e29c8099de0dd2dd5a6 Mon Sep 17 00:00:00 2001 From: codeforester Date: Sun, 31 Mar 2019 05:50:35 -0700 Subject: [PATCH 22/84] Created new --- lib/README.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 lib/README.md diff --git a/lib/README.md b/lib/README.md new file mode 100644 index 0000000..db0eff3 --- /dev/null +++ b/lib/README.md @@ -0,0 +1,27 @@ +## Logging example + +``` bash + source stdlib.sh + + SECONDS=0 + log_info "Program started" + + # set the default logger to DEBUG + set_log_level DEBUG + + log_debug "Running step 1" + # code for step 1 + + log_info "Program finished, elapsed time = $SECONDS seconds" +``` + +## Error handling example + +``` bash + + path=/path/to/required/dir + [[ -d $path ]] || fatal_error "Directory '$path' does not exist" + + + call_some_function; exit_if_error $? "Some function failed" +``` From 4ab1ebc253d7790ca42195e0a93ef035165ced9e Mon Sep 17 00:00:00 2001 From: codeforester Date: Sun, 31 Mar 2019 05:57:46 -0700 Subject: [PATCH 23/84] Added more logging examples --- lib/README.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/README.md b/lib/README.md index db0eff3..1902eab 100644 --- a/lib/README.md +++ b/lib/README.md @@ -1,4 +1,6 @@ -## Logging example +## Logging examples + +### Basic logging ``` bash source stdlib.sh @@ -15,9 +17,21 @@ log_info "Program finished, elapsed time = $SECONDS seconds" ``` +### Multiline logs + +``` + # Pass each log line as a separate argument + log_info "This is a multi-line log" "This is the second line" "This is the last line" + + # store log lines in an array and pass the array to the logging function + log_lines=("log line 1" "log line 2" "log line 3") + log_debug "${log_lines[@]}" +``` + ## Error handling example ``` bash + source stdlib.sh path=/path/to/required/dir [[ -d $path ]] || fatal_error "Directory '$path' does not exist" From 2a7a78837fbc858f0b55a1f3dea364ebbfb09e85 Mon Sep 17 00:00:00 2001 From: codeforester Date: Sun, 31 Mar 2019 06:18:50 -0700 Subject: [PATCH 24/84] Added additional examples --- lib/README.md | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/README.md b/lib/README.md index 1902eab..8ea0e74 100644 --- a/lib/README.md +++ b/lib/README.md @@ -8,12 +8,26 @@ SECONDS=0 log_info "Program started" - # set the default logger to DEBUG + # the default log level is INFO; override it to DEBUG set_log_level DEBUG log_debug "Running step 1" # code for step 1 + log_warn "This is a warning" + + required_file=/path/to/required/file + if [[ ! -f $required_file ]]; then + log_error "File '$required_file' does not exist, skipping this step" + else + # log the contents of this file in DEBUG mode + log_debug_file "$required_file" + + log_verbose "Calling process_file" + process_file "$required_file" + log_verbose "Call to process_file finished" + fi + log_info "Program finished, elapsed time = $SECONDS seconds" ``` @@ -36,6 +50,5 @@ path=/path/to/required/dir [[ -d $path ]] || fatal_error "Directory '$path' does not exist" - call_some_function; exit_if_error $? "Some function failed" ``` From 854d11f8c0d7bc3acd2d2f32c01c359da36f0e65 Mon Sep 17 00:00:00 2001 From: codeforester Date: Sun, 31 Mar 2019 11:17:56 -0700 Subject: [PATCH 25/84] Added new --- demo/README.md | 11 +++++++++++ demo/logging_demo.sh | 22 ++++++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 demo/README.md create mode 100755 demo/logging_demo.sh diff --git a/demo/README.md b/demo/README.md new file mode 100644 index 0000000..49f6612 --- /dev/null +++ b/demo/README.md @@ -0,0 +1,11 @@ +# Logging demo + +``` bash +2019-03-31:11:11:18 DEBUG ./logging_demo.sh:9 This is a debug log +2019-03-31:11:11:18 INFO ./logging_demo.sh:10 This is an info log +2019-03-31:11:11:18 WARN ./logging_demo.sh:11 This is a warning +2019-03-31:11:11:18 ERROR ./logging_demo.sh:12 This is an error +2019-03-31:11:11:18 FATAL ./logging_demo.sh:13 This is a fatal error +2019-03-31:11:11:18 VERBOSE ./logging_demo.sh:16 This is a verbose log +2019-03-31:11:11:18 WARN ./logging_demo.sh:22 This is a warning +``` diff --git a/demo/logging_demo.sh b/demo/logging_demo.sh new file mode 100755 index 0000000..90d32a0 --- /dev/null +++ b/demo/logging_demo.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash + +# run this from demo directory +source ../lib/stdlib.sh + +set_log_level DEBUG + +log_verbose "This verbose log won't print" +log_debug "This is a debug log" +log_info "This is an info log" +log_warn "This is a warning" +log_error "This is an error" +log_fatal "This is a fatal error" + +set_log_level VERBOSE +log_verbose "This is a verbose log" + +set_log_level WARN +log_verbose "This verbose log won't print" +log_debug "This debug log won't print" +log_info "This info log that won't print" +log_warn "This is a warning" From 0cf70c67542d78f3a4d1d94e69fc60dc1deb7e4f Mon Sep 17 00:00:00 2001 From: codeforester Date: Sun, 31 Mar 2019 12:09:07 -0700 Subject: [PATCH 26/84] Added support for company specific library --- base_init.sh | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/base_init.sh b/base_init.sh index 555f0ad..d2d5a2b 100755 --- a/base_init.sh +++ b/base_init.sh @@ -75,10 +75,11 @@ import_libs_and_profiles() { local lib script team local -A teams - source_it "$BASE_HOME/lib/stdlib.sh" # common library - source_it -i "$BASE_HOME/company/lib/bashrc" # company-specific bashrc for interactive shells - source_it -i "$BASE_HOME/user/$USER.sh" # user-specific bashrc for interactive shells - add_to_path "$BASE_HOME/company/bin" # add company bin to PATH + source_it "$BASE_HOME/lib/stdlib.sh" # common library + source_it "$BASE_HOME/company/lib/company.sh" # company specific library + source_it -i "$BASE_HOME/company/lib/bashrc" # company specific bashrc for interactive shells + source_it -i "$BASE_HOME/user/$USER.sh" # user specific bashrc for interactive shells + add_to_path "$BASE_HOME/company/bin" # add company bin to PATH # # team specific actions @@ -95,8 +96,8 @@ import_libs_and_profiles() { teams=() for team in $BASE_TEAM $BASE_SHARED_TEAMS "${BASE_SHARED_TEAMS[@]}"; do [[ ${teams[$team]} ]] && continue # skip if team was seen already + source_it "$BASE_HOME/team/$team/lib/$team.sh" # team specific library source_it -i "$BASE_HOME/team/$team/lib/bashrc" # team specific bashrc for interactive shells - source_it "$BASE_HOME/team/$team/lib/$team.sh" # team specific startup library add_to_path "$BASE_HOME/team/$team/bin" # add team bin to PATH (gets priority over company bin) teams[$team]=1 done @@ -159,7 +160,7 @@ base_main() { [[ $- = *i* ]] && _interactive=1 || _interactive=0 set_base_home if [[ -d $BASE_HOME ]]; then - import_libs_and_profiles + import_libs_and_profiles add_to_path "$BASE_HOME/bin" else base_error "BASE_HOME '$BASE_HOME' is not a directory or is not accessible" From c893c0a48f7417f884cc515bfd9bfcdaba040181 Mon Sep 17 00:00:00 2001 From: codeforester Date: Sun, 31 Mar 2019 12:20:50 -0700 Subject: [PATCH 27/84] Added a check so that we do nothing if the script is sourced again --- base_init.sh | 3 +++ lib/stdlib.sh | 3 +++ 2 files changed, 6 insertions(+) diff --git a/base_init.sh b/base_init.sh index d2d5a2b..fcb35e5 100755 --- a/base_init.sh +++ b/base_init.sh @@ -6,6 +6,9 @@ # lib/bashrc invokes this # +[[ $__base_init_sourced__ ]] && return +__base_init_sourced__=1 + do_init() { local rc=0 [[ -f $HOME/.base_debug ]] && export BASE_DEBUG=1 diff --git a/lib/stdlib.sh b/lib/stdlib.sh index cbcd873..91a7de9 100644 --- a/lib/stdlib.sh +++ b/lib/stdlib.sh @@ -7,6 +7,9 @@ ### - logging ### +[[ $__stdlib_sourced__ ]] && return +__stdlib_sourced__=1 + # # import: source a library from $BASE_HOME # Example: From 70c165970234e8bb6a394b27c07c53ecda21b49e Mon Sep 17 00:00:00 2001 From: codeforester Date: Mon, 1 Apr 2019 17:01:01 -0700 Subject: [PATCH 28/84] Added print_error and print_warn functions --- lib/stdlib.sh | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/lib/stdlib.sh b/lib/stdlib.sh index 91a7de9..4565430 100644 --- a/lib/stdlib.sh +++ b/lib/stdlib.sh @@ -10,6 +10,14 @@ [[ $__stdlib_sourced__ ]] && return __stdlib_sourced__=1 +# +# define colors +# +[[ $COLOR_RED ]] || COLOR_RED="\e[1;31m" +[[ $COLOR_YELLOW ]] || COLOR_YELLOW="\e[1;33m" +[[ $COLOR_OFF ]] || COLOR_OFF="\e[0m" +readonly COLOR_RED COLOR_YELLOW COLOR_OFF + # # import: source a library from $BASE_HOME # Example: @@ -202,3 +210,19 @@ fatal_error() { ((ec == 0)) && ec=1 # if it is zero, set exit code to 1 exit_if_error "$ec" "$@" } + +# print an error message to stderr +print_error() { + { + printf "${COLOR_RED}ERROR: " + printf '%s\n' "$@" + printf "$COLOR_OFF" + } >&2 +} + +# print a warning message to stdout +print_warn() { + printf "${COLOR_YELLO}WARN: " + printf '%s\n' "$@" + printf "$COLOR_OFF" +} From 148254ea6552ac03804383e5ab9605c25a7bf564 Mon Sep 17 00:00:00 2001 From: codeforester Date: Mon, 1 Apr 2019 22:05:48 -0700 Subject: [PATCH 29/84] Added new --- STANDARDS.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 STANDARDS.md diff --git a/STANDARDS.md b/STANDARDS.md new file mode 100644 index 0000000..6c9d471 --- /dev/null +++ b/STANDARDS.md @@ -0,0 +1,19 @@ +# Standards followed in this framework + +* Shell/local variables and function names follow "snake_case" - only lowercase letters, underscores, and digits. +* Environment variables use all uppercase names. For example, BASE_HOME, BASE_HOME, BASE_OS, BASE_SOURCES. +* In rare cases of global variables being shared between library functions and their callers use all uppercase names. +* Place most code inside functions. +* In libraries, have top level code that prevents the file from being sourced more than once. For example: + ```bash + [[ $__stdlib_sourced__ ]] && return + __stdlib_sourced__=1 + ``` +* Make sure all local variables inside functions are declared local. +* Use __func__ naming convention for special purpose variables and functions. +* Double quote all variable expansions, except: + - inside [[ ]] or (( )) + - places where we need word splitting to take place + +* Use [[ $var ]] to check if var has non-zero length, instead of [[ -n $var ]]. +* Make sure the code passes https://shellcheck.net checks. From 24ce18c0974e2e6f2c7d8a47d7708da0886c8c25 Mon Sep 17 00:00:00 2001 From: codeforester Date: Mon, 1 Apr 2019 22:10:28 -0700 Subject: [PATCH 30/84] Used numbered list --- STANDARDS.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/STANDARDS.md b/STANDARDS.md index 6c9d471..998766d 100644 --- a/STANDARDS.md +++ b/STANDARDS.md @@ -1,19 +1,19 @@ # Standards followed in this framework -* Shell/local variables and function names follow "snake_case" - only lowercase letters, underscores, and digits. -* Environment variables use all uppercase names. For example, BASE_HOME, BASE_HOME, BASE_OS, BASE_SOURCES. -* In rare cases of global variables being shared between library functions and their callers use all uppercase names. -* Place most code inside functions. -* In libraries, have top level code that prevents the file from being sourced more than once. For example: + 1. Shell/local variables and function names follow "snake_case" - only lowercase letters, underscores, and digits. + 2. Environment variables use all uppercase names. For example, BASE_HOME, BASE_HOME, BASE_OS, BASE_SOURCES. + 3. In rare cases of global variables being shared between library functions and their callers use all uppercase names. + 4. Place most code inside functions. + 5. In libraries, have top level code that prevents the file from being sourced more than once. For example: ```bash [[ $__stdlib_sourced__ ]] && return __stdlib_sourced__=1 ``` -* Make sure all local variables inside functions are declared local. -* Use __func__ naming convention for special purpose variables and functions. -* Double quote all variable expansions, except: - - inside [[ ]] or (( )) - - places where we need word splitting to take place + 6. Make sure all local variables inside functions are declared local. + 7. Use __func__ naming convention for special purpose variables and functions. + 8. Double quote all variable expansions, except: + - inside [[ ]] or (( )) + - places where we need word splitting to take place -* Use [[ $var ]] to check if var has non-zero length, instead of [[ -n $var ]]. -* Make sure the code passes https://shellcheck.net checks. + 9. Use [[ $var ]] to check if var has non-zero length, instead of [[ -n $var ]]. +10. Make sure the code passes https://shellcheck.net checks. From 34f1fd6ad5ed95cec2159b15f2efcedb3c27f312 Mon Sep 17 00:00:00 2001 From: codeforester Date: Mon, 1 Apr 2019 22:12:49 -0700 Subject: [PATCH 31/84] Formatting fix --- STANDARDS.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/STANDARDS.md b/STANDARDS.md index 998766d..88dd7f0 100644 --- a/STANDARDS.md +++ b/STANDARDS.md @@ -12,8 +12,8 @@ 6. Make sure all local variables inside functions are declared local. 7. Use __func__ naming convention for special purpose variables and functions. 8. Double quote all variable expansions, except: - - inside [[ ]] or (( )) - - places where we need word splitting to take place + - inside [[ ]] or (( )) + - places where we need word splitting to take place 9. Use [[ $var ]] to check if var has non-zero length, instead of [[ -n $var ]]. 10. Make sure the code passes https://shellcheck.net checks. From f8529c63f29bac6fb6d1acf253468b860a73685a Mon Sep 17 00:00:00 2001 From: codeforester Date: Mon, 1 Apr 2019 22:13:25 -0700 Subject: [PATCH 32/84] Formatting fix --- STANDARDS.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/STANDARDS.md b/STANDARDS.md index 88dd7f0..2a5cc70 100644 --- a/STANDARDS.md +++ b/STANDARDS.md @@ -12,8 +12,8 @@ 6. Make sure all local variables inside functions are declared local. 7. Use __func__ naming convention for special purpose variables and functions. 8. Double quote all variable expansions, except: - - inside [[ ]] or (( )) - - places where we need word splitting to take place + - inside [[ ]] or (( )) + - places where we need word splitting to take place 9. Use [[ $var ]] to check if var has non-zero length, instead of [[ -n $var ]]. 10. Make sure the code passes https://shellcheck.net checks. From 99685d71d24379c9a747f75a6ba8222c1cad09d6 Mon Sep 17 00:00:00 2001 From: codeforester Date: Mon, 1 Apr 2019 22:28:56 -0700 Subject: [PATCH 33/84] Added new --- team/README.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 team/README.md diff --git a/team/README.md b/team/README.md new file mode 100644 index 0000000..e197b8b --- /dev/null +++ b/team/README.md @@ -0,0 +1,19 @@ +# Sharing within a team + +- Place team-specific commands inside /bin directory +- Place team-specific shell libraries inside /lib directory +- Two libraries under /lib have special meaning: + 1. .sh - always sourced by base_init.sh + 2. bashrc - sourced by base_init.sh if the invoking shell is interactive + +- A user chooses his/her team by setting BASE_TEAM variable inside user/.sh script. +- base_init.sh adds $BASE_HOME/team/$BASE_TEAM/bin to PATH. +- To share libraries and commands of other teams, set BASE_SHARED_TEAMS variable inside user/.sh script. + 1. base_init.sh adds shared teams bin directory to PATH + 2. Shared team's libraries or bashrc are not automatically sourced in + +- To source in a team's library, use the 'import' function (defined in lib/stdlib.sh): + ```bash + import lib/.sh + import team//.sh + ``` From 692fa85b123050c79c7abc5c0f220638f83ad1ee Mon Sep 17 00:00:00 2001 From: codeforester Date: Mon, 1 Apr 2019 22:30:47 -0700 Subject: [PATCH 34/84] Fixed formatting --- team/README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/team/README.md b/team/README.md index e197b8b..759789a 100644 --- a/team/README.md +++ b/team/README.md @@ -1,14 +1,14 @@ # Sharing within a team - Place team-specific commands inside /bin directory -- Place team-specific shell libraries inside /lib directory -- Two libraries under /lib have special meaning: - 1. .sh - always sourced by base_init.sh +- Place team-specific shell libraries inside <>/lib directory +- Two libraries under <>/lib have special meaning: + 1. <>.sh - always sourced by base_init.sh 2. bashrc - sourced by base_init.sh if the invoking shell is interactive -- A user chooses his/her team by setting BASE_TEAM variable inside user/.sh script. +- A user chooses his/her team by setting BASE_TEAM variable inside user/<>.sh script. - base_init.sh adds $BASE_HOME/team/$BASE_TEAM/bin to PATH. -- To share libraries and commands of other teams, set BASE_SHARED_TEAMS variable inside user/.sh script. +- To share libraries and commands of other teams, set BASE_SHARED_TEAMS variable inside user/<>.sh script. 1. base_init.sh adds shared teams bin directory to PATH 2. Shared team's libraries or bashrc are not automatically sourced in From c25e7503afeeca3e466a15df42b5d07f3a5daa04 Mon Sep 17 00:00:00 2001 From: codeforester Date: Mon, 1 Apr 2019 22:31:58 -0700 Subject: [PATCH 35/84] Fixed formatting --- team/README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/team/README.md b/team/README.md index 759789a..b3a35cb 100644 --- a/team/README.md +++ b/team/README.md @@ -1,14 +1,14 @@ # Sharing within a team - Place team-specific commands inside /bin directory -- Place team-specific shell libraries inside <>/lib directory -- Two libraries under <>/lib have special meaning: - 1. <>.sh - always sourced by base_init.sh +- Place team-specific shell libraries inside team_name/lib directory +- Two libraries under team_name/lib have special meaning: + 1. team_name.sh - always sourced by base_init.sh 2. bashrc - sourced by base_init.sh if the invoking shell is interactive -- A user chooses his/her team by setting BASE_TEAM variable inside user/<>.sh script. +- A user chooses his/her team by setting BASE_TEAM variable inside user/user_name.sh script. - base_init.sh adds $BASE_HOME/team/$BASE_TEAM/bin to PATH. -- To share libraries and commands of other teams, set BASE_SHARED_TEAMS variable inside user/<>.sh script. +- To share libraries and commands of other teams, set BASE_SHARED_TEAMS variable inside user/user_name.sh script. 1. base_init.sh adds shared teams bin directory to PATH 2. Shared team's libraries or bashrc are not automatically sourced in From dd20e1318cb264d364f5ee58e0f132969fdfc810 Mon Sep 17 00:00:00 2001 From: codeforester Date: Tue, 2 Apr 2019 10:54:36 -0700 Subject: [PATCH 36/84] Added EDITOR and histappend settings --- lib/base_defaults.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/base_defaults.sh b/lib/base_defaults.sh index 6e8bf3a..00ff043 100644 --- a/lib/base_defaults.sh +++ b/lib/base_defaults.sh @@ -14,6 +14,7 @@ alias h='history' ### Command editing ### set -o vi +export EDITOR=vi ### ### Prompt @@ -25,3 +26,4 @@ export PS1='\[\033[0;35m\]\T \h\[\033[0;33m\] \w\[\033[00m\]: ' ### export HISTCONTROL=ignoredups:erasedups export HISTTIMEFORMAT="[%F %T] " +shopt -s histappend From b6e5fc8fb8a6993001699534a180fa847c04f446 Mon Sep 17 00:00:00 2001 From: codeforester Date: Tue, 2 Apr 2019 22:38:28 -0700 Subject: [PATCH 37/84] Added more standards --- STANDARDS.md | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/STANDARDS.md b/STANDARDS.md index 2a5cc70..762a6e2 100644 --- a/STANDARDS.md +++ b/STANDARDS.md @@ -1,5 +1,6 @@ # Standards followed in this framework + 0. Use four spaces for indentation. No tabs. 1. Shell/local variables and function names follow "snake_case" - only lowercase letters, underscores, and digits. 2. Environment variables use all uppercase names. For example, BASE_HOME, BASE_HOME, BASE_OS, BASE_SOURCES. 3. In rare cases of global variables being shared between library functions and their callers use all uppercase names. @@ -16,4 +17,18 @@ - places where we need word splitting to take place 9. Use [[ $var ]] to check if var has non-zero length, instead of [[ -n $var ]]. -10. Make sure the code passes https://shellcheck.net checks. +10. Use "compact" style for if statements and loops: + ```bash + if condition; then + ... + fi + + while condition; do + ... + done + + for ((i=0; i < limit; i++)); do + ... + done + ``` +11. Make sure the code passes https://shellcheck.net checks. From c496f668fe65c57a26e7607961634c68615343b0 Mon Sep 17 00:00:00 2001 From: codeforester Date: Wed, 3 Apr 2019 21:57:45 -0700 Subject: [PATCH 38/84] Added more info --- README.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 3a9c1c2..bfdfdb8 100644 --- a/README.md +++ b/README.md @@ -16,11 +16,13 @@ It can benefit anyone who engages with Mac/Linux command line to get things done Set up is easy. Essentially, this is what you have to do: -* Check out Base. The standard convention is $HOME/git/base. In case your git directory is elsewhere, symlink it to `$HOME/git` or specify the path by setting `BASE_HOME` in `$HOME/.baserc` file. +* Check out Base. The standard location for Base is $HOME/git/base. In case your git directory is elsewhere, symlink `$HOME/git` to it or specify the path by setting `BASE_HOME` in `$HOME/.baserc` file. * Consolidate your individual settings from your current `.bash_profile` and `.bashrc` into `$USER.sh` file. Place this file under `base/user` directory and check it in to git. * Make a backup of your `.bash_profile`. Replace this file with a symlink to `base/lib/bash_profile`. * Make a backup of your `.bashrc`. Replace this file with a symlink to `base/lib/bashrc`. +Log out and log back in or just do `exec bash` and you are all set! + Here is an example: cd $HOME @@ -37,17 +39,19 @@ Here is an example: # **How does Base work?** -In a typical setting `.bashrc` sources in `$BASE_HOME/base_init.sh` which does the following: +In a typical setting, `.bashrc` sources in `$BASE_HOME/base_init.sh` which does the following: * source in `lib/stdlib.sh` +* source in `company/lib/company.sh` if it exists * source in `company/lib/bashrc` if it exists, if the shell is interactive * source in `user/$USER.sh` if it exists and if the shell is interactive * source in team specific bashrc from team//lib/bashrc for each team defined in BASE_TEAM and BASE_SHARED_TEAMS variables, if the shell is interactive -* source in team specific library from team//lib/ for each team defined in BASE_TEAM and BASE_SHARED_TEAMS variables +* source in team specific library from team//lib/ for each team defined in BASE_TEAM and BASE_SHARED_TEAMS variables, if they exist * update `$PATH` to include the relevant `bin` directories - * `$BASE_HOME/company/bin` is always added + * `$BASE_HOME/bin` is always added * `$BASE_HOME/team/$BASE_TEAM/bin` is added if `$BASE_TEAM` is set in `user/$USER.sh` * `$BASE_HOME/team/$BASE_TEAM/bin` is added for each team defined in `$BASE_SHARED_TEAMS` (space-separated string), set in `user/$USER.sh` + * `$BASE_HOME/company/bin` is always added # **Directory structure** From 4c097c5b8c915a8ef288fe369739015eff0993c8 Mon Sep 17 00:00:00 2001 From: codeforester Date: Wed, 3 Apr 2019 22:02:43 -0700 Subject: [PATCH 39/84] Minor corrections --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index bfdfdb8..5ecdfd8 100644 --- a/README.md +++ b/README.md @@ -73,13 +73,13 @@ In a typical setting, `.bashrc` sources in `$BASE_HOME/base_init.sh` which does You can either -* specify your base location in `$HOME/.baserc`, like +* specify your Base location in `$HOME/.baserc`, like BASE_HOME=/path/to/base * symlink `$HOME/git/base` to the right place -You need to do this on every host where you want base. +You need to do this on every host where you want Base. ## I don't want to keep my personal settings private, and not in git. What should I do? @@ -93,7 +93,7 @@ Add this to your `user/$USER.sh` file: import lib/base_defaults.sh -## I want to make sure I keep my base repository updated always. How can I do it? +## I want to make sure I keep my Base repository updated always. How can I do it? Add this to your `user/$USER.sh` file: @@ -101,4 +101,5 @@ Add this to your `user/$USER.sh` file: # **Debugging** -You can turn on debug mode by touching `$HOME/.base_debug` file. You can also do the same by setting environment variable `BASE_DEBUG` to 1. You can add `set -x` to `$HOME/.baserc` file to trace the execution. +* You can turn on debug mode by touching `$HOME/.base_debug` file. You can also do the same by setting environment variable `BASE_DEBUG` to 1. +* You can add `set -x` to `$HOME/.baserc` file to trace the execution in detail. From 6093333f793c329d22a9086c939607c10accc48a Mon Sep 17 00:00:00 2001 From: codeforester Date: Wed, 3 Apr 2019 22:06:15 -0700 Subject: [PATCH 40/84] Added comments; made the associative array global --- lib/shopt.sh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/shopt.sh b/lib/shopt.sh index a75dd88..a7325c0 100644 --- a/lib/shopt.sh +++ b/lib/shopt.sh @@ -1,4 +1,9 @@ -declare -A _shopt_restore +# +# shopt.sh: Make it easy to turn shopt options on/off and restore the earlier settings +# in a clean way, preventing any side effects. +# + +declare -gA _shopt_restore shopt_set() { local opt count for opt; do From 87baf2fe11d3609b37eb25937bdf9325a5f00fff Mon Sep 17 00:00:00 2001 From: codeforester Date: Wed, 3 Apr 2019 22:08:20 -0700 Subject: [PATCH 41/84] Remove alias h --- lib/base_defaults.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/base_defaults.sh b/lib/base_defaults.sh index 00ff043..fa8749d 100644 --- a/lib/base_defaults.sh +++ b/lib/base_defaults.sh @@ -8,7 +8,6 @@ alias rm='rm -i' alias cp='cp -i' alias mv='mv -i' -alias h='history' ### ### Command editing From 857dd34dfa6547570068bdb6ff1c82b11b2fff14 Mon Sep 17 00:00:00 2001 From: codeforester Date: Thu, 4 Apr 2019 18:22:31 -0700 Subject: [PATCH 42/84] Fixed a typo --- STANDARDS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STANDARDS.md b/STANDARDS.md index 762a6e2..1554d40 100644 --- a/STANDARDS.md +++ b/STANDARDS.md @@ -2,7 +2,7 @@ 0. Use four spaces for indentation. No tabs. 1. Shell/local variables and function names follow "snake_case" - only lowercase letters, underscores, and digits. - 2. Environment variables use all uppercase names. For example, BASE_HOME, BASE_HOME, BASE_OS, BASE_SOURCES. + 2. Environment variables use all uppercase names. For example, BASE_HOME, BASE_HOST, BASE_OS, BASE_SOURCES. 3. In rare cases of global variables being shared between library functions and their callers use all uppercase names. 4. Place most code inside functions. 5. In libraries, have top level code that prevents the file from being sourced more than once. For example: From 16896bc7975f39e5d7205cc091b37a35297022e8 Mon Sep 17 00:00:00 2001 From: codeforester Date: Thu, 4 Apr 2019 18:24:12 -0700 Subject: [PATCH 43/84] Fixed another typo --- STANDARDS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STANDARDS.md b/STANDARDS.md index 1554d40..bc81408 100644 --- a/STANDARDS.md +++ b/STANDARDS.md @@ -3,7 +3,7 @@ 0. Use four spaces for indentation. No tabs. 1. Shell/local variables and function names follow "snake_case" - only lowercase letters, underscores, and digits. 2. Environment variables use all uppercase names. For example, BASE_HOME, BASE_HOST, BASE_OS, BASE_SOURCES. - 3. In rare cases of global variables being shared between library functions and their callers use all uppercase names. + 3. In rare cases of global variables being shared between library functions and their callers, use all uppercase names. 4. Place most code inside functions. 5. In libraries, have top level code that prevents the file from being sourced more than once. For example: ```bash From 0498f7f86056f36d68462afa19f8932a978795f5 Mon Sep 17 00:00:00 2001 From: codeforester Date: Sun, 7 Apr 2019 16:19:18 -0700 Subject: [PATCH 44/84] Added log_*_enter and log_*_leave functions --- demo/logging_demo.sh | 14 ++++++++- lib/stdlib.sh | 68 ++++++++++++++++++++++++++++---------------- test/test_stdlib.sh | 16 ++++++++++- 3 files changed, 71 insertions(+), 27 deletions(-) diff --git a/demo/logging_demo.sh b/demo/logging_demo.sh index 90d32a0..70d4d01 100755 --- a/demo/logging_demo.sh +++ b/demo/logging_demo.sh @@ -3,8 +3,18 @@ # run this from demo directory source ../lib/stdlib.sh -set_log_level DEBUG +test_func() { + set_log_level VERBOSE + log_info_enter + log_debug_enter + log_verbose_enter + + log_info_leave + log_debug_leave + log_verbose_leave +} +set_log_level DEBUG log_verbose "This verbose log won't print" log_debug "This is a debug log" log_info "This is an info log" @@ -20,3 +30,5 @@ log_verbose "This verbose log won't print" log_debug "This debug log won't print" log_info "This info log that won't print" log_warn "This is a warning" + +test_func diff --git a/lib/stdlib.sh b/lib/stdlib.sh index 4565430..280b59c 100644 --- a/lib/stdlib.sh +++ b/lib/stdlib.sh @@ -3,20 +3,19 @@ ### ### Areas covered: ### - PATH manipulation -### - error handling ### - logging +### - error handling ### [[ $__stdlib_sourced__ ]] && return __stdlib_sourced__=1 # -# define colors +# The only code that executes when the library is sourced # -[[ $COLOR_RED ]] || COLOR_RED="\e[1;31m" -[[ $COLOR_YELLOW ]] || COLOR_YELLOW="\e[1;33m" -[[ $COLOR_OFF ]] || COLOR_OFF="\e[0m" -readonly COLOR_RED COLOR_YELLOW COLOR_OFF +__lib_init__() { + __log_init__ +} # # import: source a library from $BASE_HOME @@ -83,20 +82,28 @@ print_path() { ## Logging ######################################################################################################################## -# -# map log level strings (FATAL, ERROR, etc.) to numeric values -# -# Note the '-g' option passed to declare - it is essential -# -unset _log_levels _loggers_level_map -declare -gA _log_levels _loggers_level_map -_log_levels=([FATAL]=0 [ERROR]=1 [WARN]=2 [INFO]=3 [DEBUG]=4 [VERBOSE]=5) - -# -# hash to map loggers to their log levels -# the default logger "default" has INFO as its default log level -# -_loggers_level_map["default"]=3 # the log level for the default logger is INFO +__log_init__() { + # colors for logging + [[ $COLOR_RED ]] || COLOR_RED="\e[1;31m" + [[ $COLOR_YELLOW ]] || COLOR_YELLOW="\e[1;33m" + [[ $COLOR_OFF ]] || COLOR_OFF="\e[0m" + readonly COLOR_RED COLOR_YELLOW COLOR_OFF + + # + # map log level strings (FATAL, ERROR, etc.) to numeric values + # + # Note the '-g' option passed to declare - it is essential + # + unset _log_levels _loggers_level_map + declare -gA _log_levels _loggers_level_map + _log_levels=([FATAL]=0 [ERROR]=1 [WARN]=2 [INFO]=3 [DEBUG]=4 [VERBOSE]=5) + + # + # hash to map loggers to their log levels + # the default logger "default" has INFO as its default log level + # + _loggers_level_map["default"]=3 # the log level for the default logger is INFO +} # # set_log_level @@ -110,11 +117,11 @@ set_log_level() { if [[ $l ]]; then _loggers_level_map[$logger]=$l else - printf '%(%Y-%m-%d:%H:%M:%S)T %s\n' -1 "WARN ${BASH_SOURCE[0]}:${BASH_LINENO[1]} Unknown log level '$in_level' for logger '$logger'; setting to INFO" + printf '%(%Y-%m-%d:%H:%M:%S)T %-7s %s\n' -1 WARN "${BASH_SOURCE[2]}:${BASH_LINENO[1]} Unknown log level '$in_level' for logger '$logger'; setting to INFO" _loggers_level_map[$logger]=3 fi else - printf '%(%Y-%m-%d:%H:%M:%S)T %s\n' -1 "WARN ${BASH_SOURCE[0]}:${BASH_LINENO[1]} Option '-l' needs an argument" >&2 + printf '%(%Y-%m-%d:%H:%M:%S)T %-7s %s\n' -1 WARN "${BASH_SOURCE[2]}:${BASH_LINENO[1]} Option '-l' needs an argument" >&2 fi } @@ -129,11 +136,11 @@ _print_log() { log_level_set="${_loggers_level_map[$logger]}" if [[ $log_level_set ]]; then ((log_level_set >= log_level)) && { - printf '%(%Y-%m-%d:%H:%M:%S)T %s %s' -1 "$in_level ${BASH_SOURCE[2]}:${BASH_LINENO[1]}" + printf '%(%Y-%m-%d:%H:%M:%S)T %-7s %s ' -1 "$in_level" "${BASH_SOURCE[2]}:${BASH_LINENO[1]}" printf '%s\n' "$@" } else - printf '%(%Y-%m-%d:%H:%M:%S)T %s\n' -1 "WARN ${BASH_SOURCE[0]}:${BASH_LINENO[1]} Unknown logger '$logger'" + printf '%(%Y-%m-%d:%H:%M:%S)T %-7s %s\n' -1 WARN "${BASH_SOURCE[2]}:${BASH_LINENO[1]} Unknown logger '$logger'" fi } @@ -154,7 +161,7 @@ _print_log_file() { log_debug "=== file output end ===" fi else - printf '%(%Y-%m-%d:%H:%M:%S)T %s\n' -1 "WARN ${BASH_SOURCE[0]}:${BASH_LINENO[1]} Unknown logger '$logger'" + printf '%(%Y-%m-%d:%H:%M:%S)T %s\n' -1 "WARN ${BASH_SOURCE[2]}:${BASH_LINENO[1]} Unknown logger '$logger'" fi } @@ -167,12 +174,21 @@ log_warn() { _print_log WARN "$@"; } log_info() { _print_log INFO "$@"; } log_debug() { _print_log DEBUG "$@"; } log_verbose() { _print_log VERBOSE "$@"; } + # # shortcut functions for logging files # log_debug_file() { _print_log_file DEBUG "$@"; } log_verbose_file() { _print_log_file VERBOSE "$@"; } +# logging for function entry and exit +log_info_enter() { _print_log INFO "Entering function ${FUNCNAME[1]}"; } +log_debug_enter() { _print_log DEBUG "Entering function ${FUNCNAME[1]}"; } +log_verbose_enter() { _print_log VERBOSE "Entering function ${FUNCNAME[1]}"; } +log_info_leave() { _print_log INFO "Leaving function ${FUNCNAME[1]}"; } +log_debug_leave() { _print_log DEBUG "Leaving function ${FUNCNAME[1]}"; } +log_verbose_leave() { _print_log VERBOSE "Leaving function ${FUNCNAME[1]}"; } + ######################################################################################################################## ## Error handling ######################################################################################################################## @@ -226,3 +242,5 @@ print_warn() { printf '%s\n' "$@" printf "$COLOR_OFF" } + +__lib_init__ diff --git a/test/test_stdlib.sh b/test/test_stdlib.sh index c25fb05..30fd52d 100755 --- a/test/test_stdlib.sh +++ b/test/test_stdlib.sh @@ -1,9 +1,11 @@ import lib/stdlib.sh test_log_func() { + [[ $1 = "-e" ]] && { local sub=_enter; shift; } + [[ $1 = "-l" ]] && { local sub=_leave; shift; } local level=$1 func=$2 expected=$3 log rc=0 set_log_level "$level" - log=$(log_$func "test $level" 2>&1) + log=$(log_$func$sub "test $level" 2>&1) if ((expected)) && ! [[ $log ]]; then printf 'Log level %-7s function %-11s: %s\n' "$level" "log_$func" FAIL ((fail++)) @@ -46,6 +48,18 @@ test_logging() { test_log_func VERBOSE debug 1 test_log_func VERBOSE verbose 1 + for func_type in e l; do + test_log_func -$func_type INFO info 1 + test_log_func -$func_type INFO debug 0 + test_log_func -$func_type INFO verbose 0 + test_log_func -$func_type DEBUG info 1 + test_log_func -$func_type DEBUG debug 1 + test_log_func -$func_type DEBUG verbose 0 + test_log_func -$func_type VERBOSE info 1 + test_log_func -$func_type VERBOSE debug 1 + test_log_func -$func_type VERBOSE verbose 1 + done + ((fail)) && rc=1 exit $rc } From 2e3f3a383e87963d6c13dcc05ed93e2fd33eeea5 Mon Sep 17 00:00:00 2001 From: codeforester Date: Sun, 7 Apr 2019 16:22:06 -0700 Subject: [PATCH 45/84] Added standard for private variables and functions --- STANDARDS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STANDARDS.md b/STANDARDS.md index bc81408..da36af8 100644 --- a/STANDARDS.md +++ b/STANDARDS.md @@ -11,7 +11,7 @@ __stdlib_sourced__=1 ``` 6. Make sure all local variables inside functions are declared local. - 7. Use __func__ naming convention for special purpose variables and functions. + 7. Use __func__ naming convention for special purpose variables and functions. Use a leading underscore for "private" variables and functions. 8. Double quote all variable expansions, except: - inside [[ ]] or (( )) - places where we need word splitting to take place From 92fe67ec1d581fa48c0b1130820e142d39df6d3c Mon Sep 17 00:00:00 2001 From: codeforester Date: Mon, 8 Apr 2019 16:49:42 -0700 Subject: [PATCH 46/84] Added log_info_file; made some cosmetic changes --- demo/logging_demo.sh | 13 +++++++++++++ lib/stdlib.sh | 28 ++++++++++++++-------------- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/demo/logging_demo.sh b/demo/logging_demo.sh index 70d4d01..3e4b1b1 100755 --- a/demo/logging_demo.sh +++ b/demo/logging_demo.sh @@ -1,5 +1,7 @@ #!/usr/bin/env bash +trap 'rm -f -- "$tempfile"' EXIT + # run this from demo directory source ../lib/stdlib.sh @@ -14,6 +16,16 @@ test_func() { log_verbose_leave } +test_file_logging() { + tempfile=/tmp/__log_demo__.txt + printf '%s\n' "first line" "second line" "third line" > $tempfile + set_log_level VERBOSE + log_info_file "$tempfile" + log_debug_file "$tempfile" + log_verbose_file "$tempfile" + rm -f -- "$tempfile" +} + set_log_level DEBUG log_verbose "This verbose log won't print" log_debug "This is a debug log" @@ -32,3 +44,4 @@ log_info "This info log that won't print" log_warn "This is a warning" test_func +test_file_logging diff --git a/lib/stdlib.sh b/lib/stdlib.sh index 280b59c..a465818 100644 --- a/lib/stdlib.sh +++ b/lib/stdlib.sh @@ -13,7 +13,7 @@ __stdlib_sourced__=1 # # The only code that executes when the library is sourced # -__lib_init__() { +__stdlib_init__() { __log_init__ } @@ -126,7 +126,7 @@ set_log_level() { } # -# core logging function +# core and private log printing logic to be called by all logging functions # _print_log() { local in_level=$1; shift @@ -156,9 +156,8 @@ _print_log_file() { log_level_set="${_loggers_level_map[$logger]}" if [[ $log_level_set ]]; then if ((log_level_set >= log_level)) && [[ -f $file ]]; then - log_debug "=== file output start ===" - cat "$1" - log_debug "=== file output end ===" + log_debug "Contents of file '$1':" + cat -- "$1" fi else printf '%(%Y-%m-%d:%H:%M:%S)T %s\n' -1 "WARN ${BASH_SOURCE[2]}:${BASH_LINENO[1]} Unknown logger '$logger'" @@ -166,7 +165,7 @@ _print_log_file() { } # -# shortcut functions for each log level +# main logging functions # log_fatal() { _print_log FATAL "$@"; } log_error() { _print_log ERROR "$@"; } @@ -174,19 +173,20 @@ log_warn() { _print_log WARN "$@"; } log_info() { _print_log INFO "$@"; } log_debug() { _print_log DEBUG "$@"; } log_verbose() { _print_log VERBOSE "$@"; } - # -# shortcut functions for logging files +# logging file content # -log_debug_file() { _print_log_file DEBUG "$@"; } +log_info_file() { _print_log_file INFO "$@"; } +log_debug_file() { _print_log_file DEBUG "$@"; } log_verbose_file() { _print_log_file VERBOSE "$@"; } - +# # logging for function entry and exit +# log_info_enter() { _print_log INFO "Entering function ${FUNCNAME[1]}"; } log_debug_enter() { _print_log DEBUG "Entering function ${FUNCNAME[1]}"; } log_verbose_enter() { _print_log VERBOSE "Entering function ${FUNCNAME[1]}"; } -log_info_leave() { _print_log INFO "Leaving function ${FUNCNAME[1]}"; } -log_debug_leave() { _print_log DEBUG "Leaving function ${FUNCNAME[1]}"; } +log_info_leave() { _print_log INFO "Leaving function ${FUNCNAME[1]}"; } +log_debug_leave() { _print_log DEBUG "Leaving function ${FUNCNAME[1]}"; } log_verbose_leave() { _print_log VERBOSE "Leaving function ${FUNCNAME[1]}"; } ######################################################################################################################## @@ -224,7 +224,7 @@ exit_if_error() { fatal_error() { local ec=$? # grab the current exit code ((ec == 0)) && ec=1 # if it is zero, set exit code to 1 - exit_if_error "$ec" "$@" + exit_if_error "$ec" "$@" } # print an error message to stderr @@ -243,4 +243,4 @@ print_warn() { printf "$COLOR_OFF" } -__lib_init__ +__stdlib_init__ From f9f3678782ee04c959ce15092b497c07f2580618 Mon Sep 17 00:00:00 2001 From: codeforester Date: Mon, 8 Apr 2019 16:59:30 -0700 Subject: [PATCH 47/84] Added print_info function --- demo/logging_demo.sh | 4 ++++ lib/stdlib.sh | 14 ++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/demo/logging_demo.sh b/demo/logging_demo.sh index 3e4b1b1..1dac022 100755 --- a/demo/logging_demo.sh +++ b/demo/logging_demo.sh @@ -45,3 +45,7 @@ log_warn "This is a warning" test_func test_file_logging + +print_error "This is a plain error" +print_warn "This is a plain warning" +print_info "This is a plain info" diff --git a/lib/stdlib.sh b/lib/stdlib.sh index a465818..c5fce08 100644 --- a/lib/stdlib.sh +++ b/lib/stdlib.sh @@ -7,6 +7,9 @@ ### - error handling ### +# +# make sure we do nothing in case the library is sourced more than once in the same shell +# [[ $__stdlib_sourced__ ]] && return __stdlib_sourced__=1 @@ -86,6 +89,7 @@ __log_init__() { # colors for logging [[ $COLOR_RED ]] || COLOR_RED="\e[1;31m" [[ $COLOR_YELLOW ]] || COLOR_YELLOW="\e[1;33m" + [[ $COLOR_BLUE ]] || COLOR_BLUE="\e[1;34m" [[ $COLOR_OFF ]] || COLOR_OFF="\e[0m" readonly COLOR_RED COLOR_YELLOW COLOR_OFF @@ -187,7 +191,7 @@ log_debug_enter() { _print_log DEBUG "Entering function ${FUNCNAME[1]}"; } log_verbose_enter() { _print_log VERBOSE "Entering function ${FUNCNAME[1]}"; } log_info_leave() { _print_log INFO "Leaving function ${FUNCNAME[1]}"; } log_debug_leave() { _print_log DEBUG "Leaving function ${FUNCNAME[1]}"; } -log_verbose_leave() { _print_log VERBOSE "Leaving function ${FUNCNAME[1]}"; } +log_verbose_leave() { _print_log VERBOSE "Leaving function ${FUNCNAME[1]}"; } ######################################################################################################################## ## Error handling @@ -238,7 +242,13 @@ print_error() { # print a warning message to stdout print_warn() { - printf "${COLOR_YELLO}WARN: " + printf "${COLOR_YELLOW}WARN: " + printf '%s\n' "$@" + printf "$COLOR_OFF" +} + +print_info() { + printf "$COLOR_BLUE" printf '%s\n' "$@" printf "$COLOR_OFF" } From 0aaa265385389f7fb9622cb20603cbbea84a8f6d Mon Sep 17 00:00:00 2001 From: codeforester Date: Mon, 8 Apr 2019 19:27:19 -0700 Subject: [PATCH 48/84] Regrouped functions a little more --- lib/stdlib.sh | 58 +++++++++++++++++++++++++-------------------------- 1 file changed, 28 insertions(+), 30 deletions(-) diff --git a/lib/stdlib.sh b/lib/stdlib.sh index c5fce08..7c986db 100644 --- a/lib/stdlib.sh +++ b/lib/stdlib.sh @@ -7,6 +7,8 @@ ### - error handling ### +################################################# PATH MANIPULATION #################################################### + # # make sure we do nothing in case the library is sourced more than once in the same shell # @@ -43,9 +45,7 @@ import() { return $rc } -######################################################################################################################## -## PATH related functions -######################################################################################################################## +################################################# PATH MANIPULATION #################################################### # add a new directory to $PATH add_to_path() { @@ -81,9 +81,7 @@ print_path() { for dir in "${dirs[@]}"; do printf '%s\n' "$dir"; done } -######################################################################################################################## -## Logging -######################################################################################################################## +#################################################### LOGGING ########################################################### __log_init__() { # colors for logging @@ -193,9 +191,29 @@ log_info_leave() { _print_log INFO "Leaving function ${FUNCNAME[1]}"; } log_debug_leave() { _print_log DEBUG "Leaving function ${FUNCNAME[1]}"; } log_verbose_leave() { _print_log VERBOSE "Leaving function ${FUNCNAME[1]}"; } -######################################################################################################################## -## Error handling -######################################################################################################################## +# print an error message to stderr +print_error() { + { + printf "${COLOR_RED}ERROR: " + printf '%s\n' "$@" + printf "$COLOR_OFF" + } >&2 +} + +# print a warning message to stdout +print_warn() { + printf "${COLOR_YELLOW}WARN: " + printf '%s\n' "$@" + printf "$COLOR_OFF" +} + +print_info() { + printf "$COLOR_BLUE" + printf '%s\n' "$@" + printf "$COLOR_OFF" +} + +################################################## ERROR HANDLING ###################################################### dump_trace() { local frame=0 line func source n=0 @@ -231,26 +249,6 @@ fatal_error() { exit_if_error "$ec" "$@" } -# print an error message to stderr -print_error() { - { - printf "${COLOR_RED}ERROR: " - printf '%s\n' "$@" - printf "$COLOR_OFF" - } >&2 -} - -# print a warning message to stdout -print_warn() { - printf "${COLOR_YELLOW}WARN: " - printf '%s\n' "$@" - printf "$COLOR_OFF" -} - -print_info() { - printf "$COLOR_BLUE" - printf '%s\n' "$@" - printf "$COLOR_OFF" -} +#################################################### END OF FUNCTIONS ################################################## __stdlib_init__ From d0d2a5e7928cfd70a9c2b898d2e6b6506adf1269 Mon Sep 17 00:00:00 2001 From: codeforester Date: Tue, 9 Apr 2019 14:06:50 -0700 Subject: [PATCH 49/84] Added demo code for error handling --- demo/error_handling_demo.sh | 38 +++++++++++++++++++++++++++++++++ demo/error_handling_demo_lib.sh | 9 ++++++++ lib/stdlib.sh | 2 +- 3 files changed, 48 insertions(+), 1 deletion(-) create mode 100755 demo/error_handling_demo.sh create mode 100644 demo/error_handling_demo_lib.sh diff --git a/demo/error_handling_demo.sh b/demo/error_handling_demo.sh new file mode 100755 index 0000000..19bd368 --- /dev/null +++ b/demo/error_handling_demo.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash + +trap 'rm -f -- "$tempfile"' EXIT + +# run this from demo directory +source ../lib/stdlib.sh +source ./error_handling_demo_lib.sh + +test_func1() { + log_debug_enter + log_info "Calling test_func2" + test_func2 + exit_if_error $? "test_func2 failed" + log_debug_leave +} + +test_func2() { + log_debug_enter + log_info "Calling test_func3" + test_func3; ret=$? + log_debug_leave + return $ret +} + +test_func3() { + log_debug_enter + return 1 + log_debug_leave +} + +main() { + set_log_level DEBUG + # run tests in subshell so that the parent can continue even after error handler calls exit + (test_func1) + (demo_lib_func) # this is defined in error_handling_demo_lib.sh +} + +main diff --git a/demo/error_handling_demo_lib.sh b/demo/error_handling_demo_lib.sh new file mode 100644 index 0000000..02ff7c8 --- /dev/null +++ b/demo/error_handling_demo_lib.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +source ../lib/stdlib.sh + +demo_lib_func() { + log_debug_enter + exit_if_error 1 "Deliberately exiting!" + log_debug_leave +} diff --git a/lib/stdlib.sh b/lib/stdlib.sh index 7c986db..e27daad 100644 --- a/lib/stdlib.sh +++ b/lib/stdlib.sh @@ -7,7 +7,7 @@ ### - error handling ### -################################################# PATH MANIPULATION #################################################### +################################################# INITIALIZATION ####################################################### # # make sure we do nothing in case the library is sourced more than once in the same shell From 2e7ddd1682efdc9347aeaebbdef3a824712064d4 Mon Sep 17 00:00:00 2001 From: codeforester Date: Tue, 9 Apr 2019 14:08:54 -0700 Subject: [PATCH 50/84] Added more bits to logging demo; added error handling demo --- demo/README.md | 58 ++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 51 insertions(+), 7 deletions(-) diff --git a/demo/README.md b/demo/README.md index 49f6612..1eaafd3 100644 --- a/demo/README.md +++ b/demo/README.md @@ -1,11 +1,55 @@ # Logging demo ``` bash -2019-03-31:11:11:18 DEBUG ./logging_demo.sh:9 This is a debug log -2019-03-31:11:11:18 INFO ./logging_demo.sh:10 This is an info log -2019-03-31:11:11:18 WARN ./logging_demo.sh:11 This is a warning -2019-03-31:11:11:18 ERROR ./logging_demo.sh:12 This is an error -2019-03-31:11:11:18 FATAL ./logging_demo.sh:13 This is a fatal error -2019-03-31:11:11:18 VERBOSE ./logging_demo.sh:16 This is a verbose log -2019-03-31:11:11:18 WARN ./logging_demo.sh:22 This is a warning +2019-04-09:14:08:04 DEBUG ./logging_demo.sh:31 This is a debug log +2019-04-09:14:08:04 INFO ./logging_demo.sh:32 This is an info log +2019-04-09:14:08:04 WARN ./logging_demo.sh:33 This is a warning +2019-04-09:14:08:04 ERROR ./logging_demo.sh:34 This is an error +2019-04-09:14:08:04 FATAL ./logging_demo.sh:35 This is a fatal error +2019-04-09:14:08:04 VERBOSE ./logging_demo.sh:38 This is a verbose log +2019-04-09:14:08:04 WARN ./logging_demo.sh:44 This is a warning +2019-04-09:14:08:04 INFO ./logging_demo.sh:10 Entering function test_func +2019-04-09:14:08:04 DEBUG ./logging_demo.sh:11 Entering function test_func +2019-04-09:14:08:04 VERBOSE ./logging_demo.sh:12 Entering function test_func +2019-04-09:14:08:04 INFO ./logging_demo.sh:14 Leaving function test_func +2019-04-09:14:08:04 DEBUG ./logging_demo.sh:15 Leaving function test_func +2019-04-09:14:08:04 VERBOSE ./logging_demo.sh:16 Leaving function test_func +2019-04-09:14:08:04 DEBUG ../lib/stdlib.sh:161 Contents of file '/tmp/__log_demo__.txt': +first line +second line +third line +2019-04-09:14:08:04 DEBUG ../lib/stdlib.sh:161 Contents of file '/tmp/__log_demo__.txt': +first line +second line +third line +2019-04-09:14:08:04 DEBUG ../lib/stdlib.sh:161 Contents of file '/tmp/__log_demo__.txt': +first line +second line +third line +ERROR: This is a plain error +WARN: This is a plain warning +This is a plain info +``` +# Error handling demo + +```bash +2019-04-09:14:07:33 DEBUG ./error_handling_demo.sh:10 Entering function test_func1 +2019-04-09:14:07:33 INFO ./error_handling_demo.sh:11 Calling test_func2 +2019-04-09:14:07:33 DEBUG ./error_handling_demo.sh:18 Entering function test_func2 +2019-04-09:14:07:33 INFO ./error_handling_demo.sh:19 Calling test_func3 +2019-04-09:14:07:33 DEBUG ./error_handling_demo.sh:26 Entering function test_func3 +2019-04-09:14:07:33 DEBUG ./error_handling_demo.sh:21 Leaving function test_func2 +2019-04-09:14:07:33 FATAL ../lib/stdlib.sh:240 test_func2 failed +Encountered a fatal error + at exit_if_error (../lib/stdlib.sh:241) + at test_func1 (./error_handling_demo.sh:13) + at main (./error_handling_demo.sh:34) + at main (./error_handling_demo.sh:38) +2019-04-09:14:07:33 DEBUG ./error_handling_demo_lib.sh:6 Entering function demo_lib_func +2019-04-09:14:07:33 FATAL ../lib/stdlib.sh:240 Deliberately exiting! +Encountered a fatal error + at exit_if_error (../lib/stdlib.sh:241) + at demo_lib_func (./error_handling_demo_lib.sh:7) + at main (./error_handling_demo.sh:35) + at main (./error_handling_demo.sh:38) ``` From ed0b2d616b7f1898ea4cd599f1794f38bdbf21eb Mon Sep 17 00:00:00 2001 From: codeforester Date: Tue, 9 Apr 2019 17:24:20 -0700 Subject: [PATCH 51/84] Added get_source_dir --- lib/stdlib.sh | 26 ++++++++++++++++++++++++++ test/test_stdlib.sh | 19 +++++++++++++++---- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/lib/stdlib.sh b/lib/stdlib.sh index e27daad..19d4bd3 100644 --- a/lib/stdlib.sh +++ b/lib/stdlib.sh @@ -20,8 +20,31 @@ __stdlib_sourced__=1 # __stdlib_init__() { __log_init__ + + # call future init functions here +} + +# +# For functions that need to return a single value, we use the global variable OUTPUT. +# For functions that need to return a more than one value, we use the global variable OUTPUT_ARRAY. +# These global variables eliminate the need for a subshell when the caller wants to retrieve the +# returned values. +# +# Each function that makes use of these global variables would call __clear_output__ as the very first step. +# +__clear_output__() { unset OUTPUT OUTPUT_ARRAY; } + +# +# return path to parent script's source directory +# +get_source_dir() { + __clear_output__ + # Reference: https://stackoverflow.com/a/246128/6862601 + OUTPUT="$(cd "$(dirname "${BASH_SOURCE[1]}")" >/dev/null 2>&1 && pwd -P)" } +################################################# LIBRARY IMPORTER ##################################################### + # # import: source a library from $BASE_HOME # Example: @@ -45,6 +68,9 @@ import() { return $rc } + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" + ################################################# PATH MANIPULATION #################################################### # add a new directory to $PATH diff --git a/test/test_stdlib.sh b/test/test_stdlib.sh index 30fd52d..ede327c 100755 --- a/test/test_stdlib.sh +++ b/test/test_stdlib.sh @@ -1,9 +1,11 @@ -import lib/stdlib.sh +#!/usr/bin/env bash + +source ../lib/stdlib.sh test_log_func() { [[ $1 = "-e" ]] && { local sub=_enter; shift; } [[ $1 = "-l" ]] && { local sub=_leave; shift; } - local level=$1 func=$2 expected=$3 log rc=0 + local level=$1 func=$2 expected=$3 log set_log_level "$level" log=$(log_$func$sub "test $level" 2>&1) if ((expected)) && ! [[ $log ]]; then @@ -59,9 +61,18 @@ test_logging() { test_log_func -$func_type VERBOSE debug 1 test_log_func -$func_type VERBOSE verbose 1 done +} - ((fail)) && rc=1 - exit $rc +test_get_source_dir() { + get_source_dir + [[ $OUTPUT != $PWD ]] && { + ((++fail)) + printf '%s\n' "get_source_dir: expected '$PWD' as output, but got '$OUTPUT' - FAIL" + } } test_logging +test_get_source_dir + +((fail)) && rc=1 +exit $rc From 30470d2732d22251d429ab0333cca8a422d0398b Mon Sep 17 00:00:00 2001 From: codeforester Date: Tue, 9 Apr 2019 17:30:32 -0700 Subject: [PATCH 52/84] Minor reshuffle --- lib/stdlib.sh | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/lib/stdlib.sh b/lib/stdlib.sh index 19d4bd3..091be20 100644 --- a/lib/stdlib.sh +++ b/lib/stdlib.sh @@ -24,25 +24,6 @@ __stdlib_init__() { # call future init functions here } -# -# For functions that need to return a single value, we use the global variable OUTPUT. -# For functions that need to return a more than one value, we use the global variable OUTPUT_ARRAY. -# These global variables eliminate the need for a subshell when the caller wants to retrieve the -# returned values. -# -# Each function that makes use of these global variables would call __clear_output__ as the very first step. -# -__clear_output__() { unset OUTPUT OUTPUT_ARRAY; } - -# -# return path to parent script's source directory -# -get_source_dir() { - __clear_output__ - # Reference: https://stackoverflow.com/a/246128/6862601 - OUTPUT="$(cd "$(dirname "${BASH_SOURCE[1]}")" >/dev/null 2>&1 && pwd -P)" -} - ################################################# LIBRARY IMPORTER ##################################################### # @@ -275,6 +256,27 @@ fatal_error() { exit_if_error "$ec" "$@" } +################################################# MISC FUNCTIONS ####################################################### +# +# For functions that need to return a single value, we use the global variable OUTPUT. +# For functions that need to return multiple values, we use the global variable OUTPUT_ARRAY. +# These global variables eliminate the need for a subshell when the caller wants to retrieve the +# returned values. +# +# Each function that makes use of these global variables would call __clear_output__ as the very first step. +# +__clear_output__() { unset OUTPUT OUTPUT_ARRAY; } + +# +# return path to parent script's source directory +# +get_source_dir() { + __clear_output__ + + # Reference: https://stackoverflow.com/a/246128/6862601 + OUTPUT="$(cd "$(dirname "${BASH_SOURCE[1]}")" >/dev/null 2>&1 && pwd -P)" +} + #################################################### END OF FUNCTIONS ################################################## __stdlib_init__ From 5316f9e926e017808525b0eb92265925b1bb6711 Mon Sep 17 00:00:00 2001 From: codeforester Date: Tue, 9 Apr 2019 17:42:30 -0700 Subject: [PATCH 53/84] Added comment about minimum Bash version needed --- lib/stdlib.sh | 8 ++++---- test/test_stdlib.sh | 4 ++++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/stdlib.sh b/lib/stdlib.sh index 091be20..1c84d19 100644 --- a/lib/stdlib.sh +++ b/lib/stdlib.sh @@ -1,5 +1,6 @@ ### ### stdlib.sh - foundation library for Bash scripts +### Need Bash version 4.3 or above - see http://tiswww.case.edu/php/chet/bash/NEWS ### ### Areas covered: ### - PATH manipulation @@ -49,9 +50,6 @@ import() { return $rc } - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" - ################################################# PATH MANIPULATION #################################################### # add a new directory to $PATH @@ -135,7 +133,9 @@ set_log_level() { } # -# core and private log printing logic to be called by all logging functions +# Core and private log printing logic to be called by all logging functions. +# Note that we don't make use of any external commands like 'date' and hence we don't fork at all. +# We use the Bash's printf builtin instead. # _print_log() { local in_level=$1; shift diff --git a/test/test_stdlib.sh b/test/test_stdlib.sh index ede327c..0f6f798 100755 --- a/test/test_stdlib.sh +++ b/test/test_stdlib.sh @@ -1,5 +1,9 @@ #!/usr/bin/env bash +# +# Note: this script needs to be run from the test directory itself. +# + source ../lib/stdlib.sh test_log_func() { From 0eff65d703758cc8fdabeb0d5338740a18c14e62 Mon Sep 17 00:00:00 2001 From: codeforester Date: Wed, 10 Apr 2019 17:41:06 -0700 Subject: [PATCH 54/84] Fixed a typo in the test for get_my_source_dir --- lib/stdlib.sh | 2 +- test/test_stdlib.sh | 28 ++++++++++++++++------------ 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/lib/stdlib.sh b/lib/stdlib.sh index 1c84d19..d9ce621 100644 --- a/lib/stdlib.sh +++ b/lib/stdlib.sh @@ -270,7 +270,7 @@ __clear_output__() { unset OUTPUT OUTPUT_ARRAY; } # # return path to parent script's source directory # -get_source_dir() { +get_my_source_dir() { __clear_output__ # Reference: https://stackoverflow.com/a/246128/6862601 diff --git a/test/test_stdlib.sh b/test/test_stdlib.sh index 0f6f798..83fb925 100755 --- a/test/test_stdlib.sh +++ b/test/test_stdlib.sh @@ -21,9 +21,6 @@ test_log_func() { } test_logging() { - local rc - - fail=0 verbose=0 rc=0 test_log_func ERROR error 1 test_log_func ERROR warn 0 test_log_func ERROR info 0 @@ -67,16 +64,23 @@ test_logging() { done } -test_get_source_dir() { - get_source_dir - [[ $OUTPUT != $PWD ]] && { +test_get_my_source_dir() { + get_my_source_dir + if [[ $OUTPUT != $PWD ]]; then ((++fail)) - printf '%s\n' "get_source_dir: expected '$PWD' as output, but got '$OUTPUT' - FAIL" - } + printf '%s\n' "get_my_source_dir: expected '$PWD' as output, but got '$OUTPUT' - FAIL" + else + ((verbose)) && printf '%s\n' "get_my_source_dir returned '$OUTPUT' - SUCCESS" + fi } -test_logging -test_get_source_dir +main() { + verbose=0 fail=0 + [[ $1 = -v ]] && verbose=1 + test_logging + test_get_my_source_dir + ((fail)) || rc=1 + exit $rc +} -((fail)) && rc=1 -exit $rc +main "$@" From c1108e6f50feef06757a2425ef639772f4be1316 Mon Sep 17 00:00:00 2001 From: codeforester Date: Wed, 10 Apr 2019 17:57:55 -0700 Subject: [PATCH 55/84] Added the demo command to the sample output --- demo/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/demo/README.md b/demo/README.md index 1eaafd3..fcf4844 100644 --- a/demo/README.md +++ b/demo/README.md @@ -1,6 +1,7 @@ # Logging demo ``` bash +$ ./logging_demo.sh 2019-04-09:14:08:04 DEBUG ./logging_demo.sh:31 This is a debug log 2019-04-09:14:08:04 INFO ./logging_demo.sh:32 This is an info log 2019-04-09:14:08:04 WARN ./logging_demo.sh:33 This is a warning @@ -33,6 +34,7 @@ This is a plain info # Error handling demo ```bash +$ ./error_handling_demo.sh 2019-04-09:14:07:33 DEBUG ./error_handling_demo.sh:10 Entering function test_func1 2019-04-09:14:07:33 INFO ./error_handling_demo.sh:11 Calling test_func2 2019-04-09:14:07:33 DEBUG ./error_handling_demo.sh:18 Entering function test_func2 From d566b43367067f5e859d7d9b5d5ec4c3dcba1f8c Mon Sep 17 00:00:00 2001 From: codeforester Date: Wed, 10 Apr 2019 18:05:02 -0700 Subject: [PATCH 56/84] Added some references --- STANDARDS.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/STANDARDS.md b/STANDARDS.md index da36af8..48046e0 100644 --- a/STANDARDS.md +++ b/STANDARDS.md @@ -3,8 +3,10 @@ 0. Use four spaces for indentation. No tabs. 1. Shell/local variables and function names follow "snake_case" - only lowercase letters, underscores, and digits. 2. Environment variables use all uppercase names. For example, BASE_HOME, BASE_HOST, BASE_OS, BASE_SOURCES. + See: https://stackoverflow.com/a/42290320/6862601 3. In rare cases of global variables being shared between library functions and their callers, use all uppercase names. - 4. Place most code inside functions. + For example: OUTPUT and OUTPUT_ARRAY + 4. Place most code inside functions and invoke the main function at the bottom of the script. 5. In libraries, have top level code that prevents the file from being sourced more than once. For example: ```bash [[ $__stdlib_sourced__ ]] && return @@ -17,6 +19,7 @@ - places where we need word splitting to take place 9. Use [[ $var ]] to check if var has non-zero length, instead of [[ -n $var ]]. + See: https://stackoverflow.com/a/49825114/6862601 10. Use "compact" style for if statements and loops: ```bash if condition; then From 85251bdc5f9971f62cc2458766eb51afe6684ba4 Mon Sep 17 00:00:00 2001 From: codeforester Date: Wed, 10 Apr 2019 18:18:40 -0700 Subject: [PATCH 57/84] Added new --- lib/net.sh | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 lib/net.sh diff --git a/lib/net.sh b/lib/net.sh new file mode 100644 index 0000000..1fadb84 --- /dev/null +++ b/lib/net.sh @@ -0,0 +1,19 @@ +# +# networking related functions +# + +# +# check if $1 is a valid IPV4 address; return 0 if true, 1 otherwise +# +validate_ip4() { + local arr element + IFS=. read -r -a arr <<< "$1" + [[ ${#arr[@]} != 4 ]] && return 1 + for element in "${arr[@]}"; do + [[ (! $element =~ ^[0-9]+$) || + $element =~ ^0[1-9]+$ + ]] && return 1 + ((element < 0 || element > 255)) && return 1 + done + return 0 +} From 0d094ca678f1ad990987d308c63839af6bd31f0c Mon Sep 17 00:00:00 2001 From: codeforester Date: Thu, 11 Apr 2019 09:57:49 -0700 Subject: [PATCH 58/84] Added van Gogh's inspiring quote --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 5ecdfd8..d30d156 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,9 @@ # **What is Base?** +``` + Great things are done by a series of small things brought together. + - Vincent van Gogh +``` Base is a sharing platform for shell settings, libraries, and light-weight tools. It gives a structured way for Bash users to organize the following across multiple hosts: * .bash_profile From 820e6e82c19d56cf8a7a016d504a1b26f73b385b Mon Sep 17 00:00:00 2001 From: codeforester Date: Fri, 12 Apr 2019 15:29:30 -0700 Subject: [PATCH 59/84] Cosmetic change --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d30d156..687177c 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # **What is Base?** ``` - Great things are done by a series of small things brought together. - - Vincent van Gogh + Great things are done by a series of small things brought together. + - Vincent van Gogh ``` Base is a sharing platform for shell settings, libraries, and light-weight tools. It gives a structured way for Bash users to organize the following across multiple hosts: From 2cee6a1525d39cddbb2a2738399f7c96539dbf14 Mon Sep 17 00:00:00 2001 From: codeforester Date: Fri, 12 Apr 2019 21:34:35 -0700 Subject: [PATCH 60/84] Added assert_valid_url --- lib/assertions.sh | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/lib/assertions.sh b/lib/assertions.sh index 9be9eab..4f49597 100644 --- a/lib/assertions.sh +++ b/lib/assertions.sh @@ -2,6 +2,9 @@ ## Assertions ## +[[ $__assertions_sourced__ ]] && return +__assertions_sourced__=1 + # # Given a version like x.y, where x and y are numbers, asserts that # bash version is at least x.y @@ -77,3 +80,12 @@ assert_not_null() { fi return 0 } + +# +# assert if $1 is a valid URL +# +assert_valid_url() { + (($#)) || return 0 + url=$1 + curl --fail --head -o /dev/null --silent "$url" || fatal_error "Invalid URL - '$url'" +} From c7ad066a8dbc3c62c051a0bd02bab09302d878b7 Mon Sep 17 00:00:00 2001 From: codeforester Date: Tue, 16 Apr 2019 22:04:17 -0700 Subject: [PATCH 61/84] Minor changes --- lib/bashrc | 2 +- lib/stdlib.sh | 6 ++++-- test/test_stdlib.sh | 4 ++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/bashrc b/lib/bashrc index ee3ef8d..23e8a6c 100644 --- a/lib/bashrc +++ b/lib/bashrc @@ -30,7 +30,7 @@ global_init() { # base_init() { local script - + script=$HOME/.baserc [[ -f $script ]] && { base_debug "Sourcing $script" diff --git a/lib/stdlib.sh b/lib/stdlib.sh index d9ce621..35f543a 100644 --- a/lib/stdlib.sh +++ b/lib/stdlib.sh @@ -124,11 +124,13 @@ set_log_level() { if [[ $l ]]; then _loggers_level_map[$logger]=$l else - printf '%(%Y-%m-%d:%H:%M:%S)T %-7s %s\n' -1 WARN "${BASH_SOURCE[2]}:${BASH_LINENO[1]} Unknown log level '$in_level' for logger '$logger'; setting to INFO" + printf '%(%Y-%m-%d:%H:%M:%S)T %-7s %s\n' -1 WARN \ + "${BASH_SOURCE[2]}:${BASH_LINENO[1]} Unknown log level '$in_level' for logger '$logger'; setting to INFO" _loggers_level_map[$logger]=3 fi else - printf '%(%Y-%m-%d:%H:%M:%S)T %-7s %s\n' -1 WARN "${BASH_SOURCE[2]}:${BASH_LINENO[1]} Option '-l' needs an argument" >&2 + printf '%(%Y-%m-%d:%H:%M:%S)T %-7s %s\n' -1 WARN \ + "${BASH_SOURCE[2]}:${BASH_LINENO[1]} Option '-l' needs an argument" >&2 fi } diff --git a/test/test_stdlib.sh b/test/test_stdlib.sh index 83fb925..c36856c 100755 --- a/test/test_stdlib.sh +++ b/test/test_stdlib.sh @@ -75,11 +75,11 @@ test_get_my_source_dir() { } main() { - verbose=0 fail=0 + verbose=0 fail=0 rc=0 [[ $1 = -v ]] && verbose=1 test_logging test_get_my_source_dir - ((fail)) || rc=1 + ((fail)) && rc=1 exit $rc } From f333686577aaa58a31fc9f5e928136fd751862bb Mon Sep 17 00:00:00 2001 From: codeforester Date: Wed, 17 Apr 2019 10:07:26 -0700 Subject: [PATCH 62/84] Removed test code, fixed indentation --- lib/assertions.sh | 86 ++++++++++++++++++++--------------------------- 1 file changed, 37 insertions(+), 49 deletions(-) diff --git a/lib/assertions.sh b/lib/assertions.sh index 4f49597..67c1435 100644 --- a/lib/assertions.sh +++ b/lib/assertions.sh @@ -10,53 +10,42 @@ __assertions_sourced__=1 # bash version is at least x.y # assert_minimum_bash_version() { - local version=$1 message=$2 - local version_array curr_version version_re='^[0-9]+\.[0-9]+$' - - assert_arg_count $# 1 "Usage: assert_minimum_bash_version version" - assert_regex_match "$version" "$version_re" "Version should be in the format x.y where x and y are integers" - version_array=(${version//\./ }) - (( BASH_VERSINFO[0] < version_array[0] || - ((BASH_VERSINFO[0] == version_array[0] && BASH_VERSINFO[1] < version_array[1])))) && { - curr_version="${BASH_VERSINFO[@]:0:4}" - [[ $message ]] || message="Running with Bash version ${curr_version// /.}; need $version or above" - printf '%s\n' "$message" >&2 - exit 1 - } - return 0 + local version=$1 message=$2 + local version_array curr_version version_re='^[0-9]+\.[0-9]+$' + assert_arg_count $# 1 "Usage: assert_minimum_bash_version version" + assert_regex_match "$version" "$version_re" "Version should be in the format x.y where x and y are integers" + version_array=(${version//\./ }) + ((BASH_VERSINFO[0] < version_array[0] || + ((BASH_VERSINFO[0] == version_array[0] && BASH_VERSINFO[1] < version_array[1])))) && { + curr_version="${BASH_VERSINFO[@]:0:4}" + [[ $message ]] || message="Running with Bash version ${curr_version// /.}; need $version or above" + printf '%s\n' "$message" >&2 + exit 1 + } + return 0 } -# -# test code - run this to test the functions in this library -# the tests run in a sub shell and hence won't exit the main shell in case of failures -# -test_stdlib() ( - assert_minimum_bash_version "$@" -) - # # exit if number of arguments passed doesn't meet expectations # example call: # assert_arg_count $# 2 "Need exactly two arguments" # assert_arg_count() { - local actual=$1 expected=$2 message=$3 - - ((actual != expected)) && { - [[ $message ]] || message="Expected $expected arguments, got $actual arguments" - printf '%s\n' "$message" >&2 - exit 1 - } + local actual=$1 expected=$2 message=$3 + ((actual != expected)) && { + [[ $message ]] || message="Expected $expected arguments, got $actual arguments" + printf '%s\n' "$message" >&2 + exit 1 + } } assert_regex_match() { - local string=$1 regex=$2 message=$3 - - [[ $string =~ $regex ]] || { - [[ $message ]] || message="String '$string' does not match regex '$regex'" - printf '%s\n' "$message" >&2 - exit 1 - } + local string=$1 regex=$2 message=$3 + [[ $string =~ $regex ]] || { + [[ $message ]] || message="String '$string' does not match regex '$regex'" + printf '%s\n' "$message" >&2 + exit 1 + } } # @@ -66,19 +55,18 @@ assert_regex_match() { # Usage: assert_not_null [-f] variable ... # assert_not_null() { - local fatal var num_null=0 - [[ "$1" = "-f" ]] && { shift; fatal=1; } - for var in "$@"; do - [[ -z "${!var}" ]] && - printf '%s\n' "Variable '$var' not set" >&2 && - ((num_null++)) - done - - if ((num_null > 0)); then - [[ "$fatal" ]] && exit 1 - return 1 - fi - return 0 + local fatal var num_null=0 + [[ "$1" = "-f" ]] && { shift; fatal=1; } + for var in "$@"; do + [[ -z "${!var}" ]] && printf '%s\n' "Variable '$var' not set" >&2 && + ((num_null++)) + done + + if ((num_null > 0)); then + [[ "$fatal" ]] && exit 1 + return 1 + fi + return 0 } # From 99015ee511dc3ac157fb1b066700cdb46944a8c9 Mon Sep 17 00:00:00 2001 From: codeforester Date: Sat, 27 Apr 2019 00:18:02 -0700 Subject: [PATCH 63/84] Cosmetic changes --- team/README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/team/README.md b/team/README.md index b3a35cb..c89c0e1 100644 --- a/team/README.md +++ b/team/README.md @@ -1,14 +1,14 @@ # Sharing within a team -- Place team-specific commands inside /bin directory +- Place team-specific commands inside `/bin` directory - Place team-specific shell libraries inside team_name/lib directory - Two libraries under team_name/lib have special meaning: - 1. team_name.sh - always sourced by base_init.sh - 2. bashrc - sourced by base_init.sh if the invoking shell is interactive + 1. team_name.sh - always sourced by `base_init.sh` + 2. bashrc - sourced by `base_init.sh` if the invoking shell is interactive - A user chooses his/her team by setting BASE_TEAM variable inside user/user_name.sh script. -- base_init.sh adds $BASE_HOME/team/$BASE_TEAM/bin to PATH. -- To share libraries and commands of other teams, set BASE_SHARED_TEAMS variable inside user/user_name.sh script. +- `base_init.sh` adds `$BASE_HOME/team/$BASE_TEAM/bin` to PATH. +- To share libraries and commands of other teams, set BASE_SHARED_TEAMS variable inside `user/user_name.sh` script. 1. base_init.sh adds shared teams bin directory to PATH 2. Shared team's libraries or bashrc are not automatically sourced in From 0f8c63e5fa776a2fd8edd216dd1cf1d1e48635fe Mon Sep 17 00:00:00 2001 From: codeforester Date: Sat, 27 Apr 2019 00:21:36 -0700 Subject: [PATCH 64/84] More cosmetic changes --- team/README.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/team/README.md b/team/README.md index c89c0e1..a082669 100644 --- a/team/README.md +++ b/team/README.md @@ -1,18 +1,18 @@ # Sharing within a team - Place team-specific commands inside `/bin` directory -- Place team-specific shell libraries inside team_name/lib directory -- Two libraries under team_name/lib have special meaning: - 1. team_name.sh - always sourced by `base_init.sh` - 2. bashrc - sourced by `base_init.sh` if the invoking shell is interactive +- Place team-specific shell libraries inside `/lib` directory +- Two libraries under `/lib` have special meaning: + 1. `.sh` - always sourced by `base_init.sh` + 2. `bashrc` - sourced by `base_init.sh` if the invoking shell is interactive -- A user chooses his/her team by setting BASE_TEAM variable inside user/user_name.sh script. -- `base_init.sh` adds `$BASE_HOME/team/$BASE_TEAM/bin` to PATH. -- To share libraries and commands of other teams, set BASE_SHARED_TEAMS variable inside `user/user_name.sh` script. - 1. base_init.sh adds shared teams bin directory to PATH - 2. Shared team's libraries or bashrc are not automatically sourced in +- A user chooses his/her team by setting `BASE_TEAM` variable inside user/user_name.sh script. +- `base_init.sh` adds `$BASE_HOME/team/$BASE_TEAM/bin` to `PATH`. +- To share libraries and commands of other teams, set `BASE_SHARED_TEAMS` variable inside `user/user_name.sh` script. + 1. `base_init.sh` adds shared teams bin directory to `PATH` + 2. Shared team's libraries or `bashrc` are not automatically sourced in -- To source in a team's library, use the 'import' function (defined in lib/stdlib.sh): +- To source in a team's library, use the `import` function (defined in `lib/stdlib.sh`): ```bash import lib/.sh import team//.sh From 6de3268e2c902b13c83135a33db1a50b8621b680 Mon Sep 17 00:00:00 2001 From: codeforester Date: Sat, 27 Apr 2019 09:46:44 -0700 Subject: [PATCH 65/84] Added more info --- README.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 687177c..835619e 100644 --- a/README.md +++ b/README.md @@ -49,8 +49,8 @@ In a typical setting, `.bashrc` sources in `$BASE_HOME/base_init.sh` which does * source in `company/lib/company.sh` if it exists * source in `company/lib/bashrc` if it exists, if the shell is interactive * source in `user/$USER.sh` if it exists and if the shell is interactive -* source in team specific bashrc from team//lib/bashrc for each team defined in BASE_TEAM and BASE_SHARED_TEAMS variables, if the shell is interactive -* source in team specific library from team//lib/ for each team defined in BASE_TEAM and BASE_SHARED_TEAMS variables, if they exist +* source in team specific bashrc from `team//lib/bashrc` for each team defined in `BASE_TEAM` and `BASE_SHARED_TEAMS` variables, if the shell is interactive +* source in team specific library from `team//lib/.sh` for each team defined in `BASE_TEAM` and `BASE_SHARED_TEAMS` variables, if they exist * update `$PATH` to include the relevant `bin` directories * `$BASE_HOME/bin` is always added * `$BASE_HOME/team/$BASE_TEAM/bin` is added if `$BASE_TEAM` is set in `user/$USER.sh` @@ -71,6 +71,12 @@ In a typical setting, `.bashrc` sources in `$BASE_HOME/base_init.sh` which does * BASE_HOST * BASE_SOURCES +# **Functions exported by base_init.sh** + +* import - sources in libraries from any place under `BASE_HOME` directory +* base_wrapper - initializes Base inside scripts +* base_update - does a `git pull` on Base git directory; add it to `user/.sh` to "auto update" Base + # **FAQ** ## My git location is not `$HOME/git/base`. What should I do? From 2fbbd250a8fc4ddefa830684aae549c4d013c241 Mon Sep 17 00:00:00 2001 From: codeforester Date: Sun, 28 Apr 2019 09:25:06 -0700 Subject: [PATCH 66/84] Improved sharing info --- team/README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/team/README.md b/team/README.md index a082669..a0b83fb 100644 --- a/team/README.md +++ b/team/README.md @@ -1,16 +1,18 @@ # Sharing within a team +- Choose your team by setting `BASE_TEAM` variable inside your `user/.sh` script. - Place team-specific commands inside `/bin` directory - Place team-specific shell libraries inside `/lib` directory - Two libraries under `/lib` have special meaning: 1. `.sh` - always sourced by `base_init.sh` 2. `bashrc` - sourced by `base_init.sh` if the invoking shell is interactive - -- A user chooses his/her team by setting `BASE_TEAM` variable inside user/user_name.sh script. - `base_init.sh` adds `$BASE_HOME/team/$BASE_TEAM/bin` to `PATH`. -- To share libraries and commands of other teams, set `BASE_SHARED_TEAMS` variable inside `user/user_name.sh` script. + +# Sharing among teams + +- To share libraries and commands of other teams, set `BASE_SHARED_TEAMS` variable inside `user/.sh` script. 1. `base_init.sh` adds shared teams bin directory to `PATH` - 2. Shared team's libraries or `bashrc` are not automatically sourced in + 2. Shared team's `/lib/.sh` libraries or `bashrc` are not automatically sourced in - To source in a team's library, use the `import` function (defined in `lib/stdlib.sh`): ```bash From fe724e2ac7e7565c5a6cc220cb1885e287f66a44 Mon Sep 17 00:00:00 2001 From: codeforester Date: Fri, 3 May 2019 20:50:00 -0700 Subject: [PATCH 67/84] Added test_base_init.sh --- test/test_base_init.sh | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 test/test_base_init.sh diff --git a/test/test_base_init.sh b/test/test_base_init.sh new file mode 100644 index 0000000..a5abfe3 --- /dev/null +++ b/test/test_base_init.sh @@ -0,0 +1,5 @@ +# +# test base_init.sh +# + +source ../base_init.sh From 70ba556089aea3fa13bfb8e5fb60a9a882e022eb Mon Sep 17 00:00:00 2001 From: codeforester Date: Fri, 3 May 2019 20:51:42 -0700 Subject: [PATCH 68/84] A cosmetic change --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 835619e..4ee6c11 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Base is a sharing platform for shell settings, libraries, and light-weight tools * user specific settings (aliases, functions, Bash settings) * Bash libraries, commands, and configuration that are shared across teams -It can benefit anyone who engages with Mac/Linux command line to get things done. +It can benefit anyone who engages with Mac/Linux command line to get their work done. # **How can I get set up?** From 9a5eaa12d223caa151cff1573132c54f4f51ed11 Mon Sep 17 00:00:00 2001 From: codeforester Date: Sun, 5 May 2019 12:09:09 -0700 Subject: [PATCH 69/84] Fixed a sentence that was wrongly stated --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4ee6c11..efdeb57 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ In a typical setting, `.bashrc` sources in `$BASE_HOME/base_init.sh` which does * source in `company/lib/company.sh` if it exists * source in `company/lib/bashrc` if it exists, if the shell is interactive * source in `user/$USER.sh` if it exists and if the shell is interactive -* source in team specific bashrc from `team//lib/bashrc` for each team defined in `BASE_TEAM` and `BASE_SHARED_TEAMS` variables, if the shell is interactive +* source in team specific bashrc from `team//lib/bashrc` for each team defined in `BASE_TEAM` and `BASE_SHARED_TEAMS` variables, if the shell is interactive. Note that `BASE_TEAM` and `BASE_SHARED_TEAMS` should be ideally set in `user/$USER.sh`. * source in team specific library from `team//lib/.sh` for each team defined in `BASE_TEAM` and `BASE_SHARED_TEAMS` variables, if they exist * update `$PATH` to include the relevant `bin` directories * `$BASE_HOME/bin` is always added @@ -91,12 +91,14 @@ You can either You need to do this on every host where you want Base. -## I don't want to keep my personal settings private, and not in git. What should I do? +## I want to keep my personal settings private, and not in git. What should I do? * write a one-liner in `user/$USER.sh` like this: source /path/to/your.settings +You would need to manage this file outside of Base. + ## I do want to use the default settings. What should I do? Add this to your `user/$USER.sh` file: From 6dd80f3d512b79832d57b11f30f20fd28eb410a0 Mon Sep 17 00:00:00 2001 From: codeforester Date: Sat, 11 May 2019 13:01:48 -0700 Subject: [PATCH 70/84] Added new --- bin/caff | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100755 bin/caff diff --git a/bin/caff b/bin/caff new file mode 100755 index 0000000..5b10d72 --- /dev/null +++ b/bin/caff @@ -0,0 +1,47 @@ +# +# caff: call caffeinate for a named process +# + +_help() { + cat << EOUSAGE +$description +Usage: caff process_name +EOUSAGE +} + +_describe() { + printf '%s\n' "$description" +} + +main() { + (($# != 1)) && { + print_error "need an argument" + _help + exit 2 + } + + process_name=$1 + local vpid=$(pgrep "$process_name") + if [[ ! $vpid ]]; then + print_warn "'$process_name' process not running" + exit 1 + fi + local cpid=$(pgrep caffeinate) + if [[ $cpid ]]; then + caffeinate_pid=$(ps -o args -p "$cpid" | awk 'NR==2 {print $3}') + if [[ $caffeinate_pid == $vpid ]]; then + printf '%s\n' "Alreading caffeinating, pid=$cpid" + exit 0 + fi + fi + + printf '%s\n' "Caffeinating PID $vpid" + caffeinate -iw "$vpid" & disown + exit $? +} + +description="Caffeinate a named process" +base_wrapper -d "$@" || { + printf '%s\n' "You need to initialize Base before running this script." >&2 + exit 1 +} From 9cae958c5f1c0256c52f73213631ceffed7989f6 Mon Sep 17 00:00:00 2001 From: codeforester Date: Sun, 12 May 2019 18:38:05 -0700 Subject: [PATCH 71/84] Create LICENSE --- LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..48e25d6 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Ramesh Padmanabhaiah + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From e730f778a40e00386acdf8bfc9c4c74308a74ed4 Mon Sep 17 00:00:00 2001 From: codeforester Date: Sun, 12 May 2019 18:42:27 -0700 Subject: [PATCH 72/84] Added more comments --- bin/caff | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/bin/caff b/bin/caff index 5b10d72..6b10f7b 100755 --- a/bin/caff +++ b/bin/caff @@ -1,7 +1,11 @@ # -# caff: call caffeinate for a named process +# caff: invoke caffeinate for a named process on macOS +# +# For example: this script can be used for watching over the VPN process so that it doesn't terminate the connection +# due to inactivity # +description="Caffeinate a named process" _help() { cat << EOUSAGE $description @@ -9,9 +13,7 @@ Usage: caff process_name EOUSAGE } -_describe() { - printf '%s\n' "$description" -} +_describe() { printf '%s\n' "$description"; } main() { (($# != 1)) && { @@ -40,7 +42,9 @@ main() { exit $? } -description="Caffeinate a named process" +# +# Note: base_wrapper calls the main function +# base_wrapper -d "$@" || { printf '%s\n' "You need to initialize Base before running this script." >&2 exit 1 From c4d4ec7c4c335980be7ef9cb981d9a2f62c500a5 Mon Sep 17 00:00:00 2001 From: codeforester Date: Thu, 16 May 2019 12:56:30 -0700 Subject: [PATCH 73/84] Added a check to make sure caffeinate command is available --- bin/caff | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/bin/caff b/bin/caff index 6b10f7b..2f80d67 100755 --- a/bin/caff +++ b/bin/caff @@ -1,11 +1,7 @@ # -# caff: invoke caffeinate for a named process on macOS -# -# For example: this script can be used for watching over the VPN process so that it doesn't terminate the connection -# due to inactivity +# caff: call caffeinate for a named process # -description="Caffeinate a named process" _help() { cat << EOUSAGE $description @@ -13,9 +9,16 @@ Usage: caff process_name EOUSAGE } -_describe() { printf '%s\n' "$description"; } +_describe() { + printf '%s\n' "$description" +} main() { + if ! type -ft caffeinate >/dev/null; then + print_error "There is no caffeinate command on your system" + exit 1 + fi + (($# != 1)) && { print_error "need an argument" _help @@ -42,9 +45,7 @@ main() { exit $? } -# -# Note: base_wrapper calls the main function -# +description="Caffeinate a named process" base_wrapper -d "$@" || { printf '%s\n' "You need to initialize Base before running this script." >&2 exit 1 From ae310a9c5b00393ad82019b35160ab98ba8f88f9 Mon Sep 17 00:00:00 2001 From: codeforester Date: Fri, 17 May 2019 12:11:25 -0700 Subject: [PATCH 74/84] Replaced tabs with spaces --- bin/caff | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/bin/caff b/bin/caff index 2f80d67..63af5b8 100755 --- a/bin/caff +++ b/bin/caff @@ -3,14 +3,14 @@ # _help() { - cat << EOUSAGE + cat << EOUSAGE $description Usage: caff process_name EOUSAGE } _describe() { - printf '%s\n' "$description" + printf '%s\n' "$description" } main() { @@ -19,13 +19,13 @@ main() { exit 1 fi - (($# != 1)) && { - print_error "need an argument" - _help - exit 2 - } + (($# != 1)) && { + print_error "need an argument" + _help + exit 2 + } - process_name=$1 + process_name=$1 local vpid=$(pgrep "$process_name") if [[ ! $vpid ]]; then print_warn "'$process_name' process not running" @@ -47,6 +47,6 @@ main() { description="Caffeinate a named process" base_wrapper -d "$@" || { - printf '%s\n' "You need to initialize Base before running this script." >&2 - exit 1 + printf '%s\n' "You need to initialize Base before running this script." >&2 + exit 1 } From ce4704f668337d3e7556f7d6fbf2e05bd476050a Mon Sep 17 00:00:00 2001 From: codeforester Date: Sat, 18 May 2019 13:07:34 -0700 Subject: [PATCH 75/84] Added base_deactivate feature --- README.md | 26 +++++++++++++++++++++++++- base_init.sh | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index efdeb57..e79c118 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,10 @@ Base is a sharing platform for shell settings, libraries, and light-weight tools It can benefit anyone who engages with Mac/Linux command line to get their work done. +# **Requirements** + +Base needs Bash version 4.2 or above. + # **How can I get set up?** Set up is easy. Essentially, this is what you have to do: @@ -31,7 +35,7 @@ Here is an example: cd $HOME mkdir git && cd git - git clone git@github.com:codeforester/base.git + git clone ssh://git.corp.linkedin.com:29418/tools-sre/base cd $HOME mv .bash_profile .bash_profile.safe && ln -sf $HOME/git/base/lib/bash_profile .bash_profile mv .bashrc .bashrc.safe && ln -sf $HOME/git/base/lib/bashrc .bashrc @@ -111,6 +115,26 @@ Add this to your `user/$USER.sh` file: base_update +## I don't want to reorganize my `.bash_profile` or `.bashrc`. Can I still use Base? + +Yes, you can, though you will lose the flexibility of keeping your `.bash_profile` and `.bashrc` synced across hosts in case you are working with multiple hosts. + +To turn on Base upon login, add this to your `.bash_profile`: + + source "$BASE_HOME/base_init.sh" + +after making sure you have the base repo checked out under `$BASE_HOME` directory. + +If you don't want to change your `.bash_profile` at all, you can still turn Base on and off as needed. + +To turn it on: + + source "$BASE_HOME/base_init.sh" + +To turn it off: + + base_deactivate + # **Debugging** * You can turn on debug mode by touching `$HOME/.base_debug` file. You can also do the same by setting environment variable `BASE_DEBUG` to 1. diff --git a/base_init.sh b/base_init.sh index fcb35e5..b58fe52 100755 --- a/base_init.sh +++ b/base_init.sh @@ -9,6 +9,45 @@ [[ $__base_init_sourced__ ]] && return __base_init_sourced__=1 +check_bash_version() { + local major=${1:-4} + local minor=$2 + local rc=0 + local num_re='^[0-9]+$' + + if [[ ! $major =~ $num_re ]] || [[ $minor && ! $minor =~ $num_re ]]; then + printf '%s\n' "ERROR: version numbers should be numeric" + return 1 + fi + if [[ $minor ]]; then + local bv=${BASH_VERSINFO[0]}${BASH_VERSINFO[1]} + local vstring=$major.$minor + local vnum=$major$minor + else + local bv=${BASH_VERSINFO[0]} + local vstring=$major + local vnum=$major + fi + ((bv < vnum)) && { + printf '%s\n' "ERROR: Base needs Bash version $vstring or above, your version is ${BASH_VERSINFO[0]}.${BASH_VERSINFO[1]}" + rc=1 + } + return $rc +} + +base_deactivate() { + if [[ $_old_vars_saved ]]; then + PATH=$_old_PATH + PS1=$_old_PS1 + [[ $_old_BASE_HOME ]] && BASE_HOME=$_old_BASE_HOME + + unset _old_PATH _old_PS1 _old_vars_saved _old_BASE_HOME + unset BASE_OS BASE_HOST BASE_DEBUG BASE_SOURCES + unset -f check_bash_version do_init base_debug base_error set_base_home source_it \ + import_libs_and_profiles base_update base_wrapper base_main + fi +} + do_init() { local rc=0 [[ -f $HOME/.base_debug ]] && export BASE_DEBUG=1 @@ -30,6 +69,15 @@ do_init() { BASE_OS=$(uname -s) BASE_HOST=$(hostname -s) export BASE_SOURCES=() BASE_OS BASE_HOST + + # + # save variables that need to be restored in deactivate + # + _old_vars_saved=1 + _old_PATH=$PATH + _old_PS1=$PS1 + _old_BASE_HOME=$BASE_HOME + return $rc } @@ -159,6 +207,7 @@ base_wrapper() { } base_main() { + check_bash_version 4 2 || return $? do_init || return $? [[ $- = *i* ]] && _interactive=1 || _interactive=0 set_base_home From abdd74cdd8fefefd8cd6078ca43c0bf0f6416e3e Mon Sep 17 00:00:00 2001 From: codeforester Date: Sat, 18 May 2019 16:38:03 -0700 Subject: [PATCH 76/84] Corrected git URL --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e79c118..acb6668 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ Here is an example: cd $HOME mkdir git && cd git - git clone ssh://git.corp.linkedin.com:29418/tools-sre/base + git clone git@github.com:codeforester/base.git cd $HOME mv .bash_profile .bash_profile.safe && ln -sf $HOME/git/base/lib/bash_profile .bash_profile mv .bashrc .bashrc.safe && ln -sf $HOME/git/base/lib/bashrc .bashrc From db7956a0de296c706eb86d59f79dbe50e3bcea2e Mon Sep 17 00:00:00 2001 From: codeforester Date: Sat, 18 May 2019 20:18:58 -0700 Subject: [PATCH 77/84] Added a note that Base could be used in a partial way as well --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index acb6668..079624a 100644 --- a/README.md +++ b/README.md @@ -45,6 +45,8 @@ Here is an example: git commit -m "Adding the initial version of $USER.sh" git push +If you don't want to disturb your `.bash_profile` and `.bashrc`, you can still use Base in a less full-fledged manner. See the FAQ section for details. + # **How does Base work?** In a typical setting, `.bashrc` sources in `$BASE_HOME/base_init.sh` which does the following: From 6fff95574fdf5c0db4f86f5ab52ca55759da110e Mon Sep 17 00:00:00 2001 From: codeforester Date: Sat, 18 May 2019 23:03:46 -0700 Subject: [PATCH 78/84] Added base_activate --- base_init.sh | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/base_init.sh b/base_init.sh index b58fe52..2351c2c 100755 --- a/base_init.sh +++ b/base_init.sh @@ -35,6 +35,23 @@ check_bash_version() { return $rc } +base_activate() { + local rc=0 + if [[ ! $BASE_HOME ]]; then + printf '%s\n' "ERROR: BASE_HOME is not set" + rc=1 + else + local script=$BASE_HOME/base_init.sh + if [[ -f "$script" ]]; then + source "$script" + else + printf '%s\n' "ERROR: Base init script '$script' does not exist" + rc=1 + fi + fi + return $rc +} + base_deactivate() { if [[ $_old_vars_saved ]]; then PATH=$_old_PATH @@ -44,7 +61,8 @@ base_deactivate() { unset _old_PATH _old_PS1 _old_vars_saved _old_BASE_HOME unset BASE_OS BASE_HOST BASE_DEBUG BASE_SOURCES unset -f check_bash_version do_init base_debug base_error set_base_home source_it \ - import_libs_and_profiles base_update base_wrapper base_main + import_libs_and_profiles base_update base_wrapper base_main \ + base_deactivate fi } From 71696b9c4835a147c189d9ff2ee39aac4eb8532c Mon Sep 17 00:00:00 2001 From: codeforester Date: Sun, 19 May 2019 18:39:39 -0700 Subject: [PATCH 79/84] Fixed an issue in activate/deactivate logic --- base_init.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/base_init.sh b/base_init.sh index 2351c2c..69cab2b 100755 --- a/base_init.sh +++ b/base_init.sh @@ -43,7 +43,8 @@ base_activate() { else local script=$BASE_HOME/base_init.sh if [[ -f "$script" ]]; then - source "$script" + unset __base_init_sourced__ # bypass the "idempotence" check + source "$script" # which makes sure the script really gets sourced else printf '%s\n' "ERROR: Base init script '$script' does not exist" rc=1 @@ -63,6 +64,7 @@ base_deactivate() { unset -f check_bash_version do_init base_debug base_error set_base_home source_it \ import_libs_and_profiles base_update base_wrapper base_main \ base_deactivate + unset __base_init_sourced__ fi } @@ -239,7 +241,7 @@ base_main() { # # these functions need to be available to user's subprocesses # - export -f base_update base_wrapper import + export -f base_update base_wrapper import base_activate base_deactivate } # From 6c77ef7eb57e9c9a04d45b79ae3d4f0bad33241c Mon Sep 17 00:00:00 2001 From: codeforester Date: Wed, 29 May 2019 11:19:58 -0700 Subject: [PATCH 80/84] Added initialization for EXINIT --- lib/base_defaults.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/base_defaults.sh b/lib/base_defaults.sh index fa8749d..0b8a9bb 100644 --- a/lib/base_defaults.sh +++ b/lib/base_defaults.sh @@ -15,6 +15,11 @@ alias mv='mv -i' set -o vi export EDITOR=vi +### +### vi/vim +### +export EXINIT="set ts=4 sw=4 ai nows nosm expandtab" + ### ### Prompt ### From 1fe417d70b1b69c5e007529dfef5d88d01087e2e Mon Sep 17 00:00:00 2001 From: codeforester Date: Fri, 7 Jun 2019 23:02:55 -0700 Subject: [PATCH 81/84] Added new --- user/common_user.sh | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 user/common_user.sh diff --git a/user/common_user.sh b/user/common_user.sh new file mode 100644 index 0000000..97c780a --- /dev/null +++ b/user/common_user.sh @@ -0,0 +1,12 @@ +import lib/base_defaults.sh + +# +# vi +# +export EXINIT="set ts=4 expandtab sw=4 nows ai nosm|syntax off" +export EDITOR=vi + +# +# kubernetes +# +alias kc=kubectl From d4b831e6f454f75020da0d70fd316827c3d48220 Mon Sep 17 00:00:00 2001 From: codeforester Date: Wed, 12 Jun 2019 23:21:12 -0700 Subject: [PATCH 82/84] Handling the case of more than one matching processes --- bin/caff | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bin/caff b/bin/caff index 63af5b8..d1b942c 100755 --- a/bin/caff +++ b/bin/caff @@ -6,6 +6,7 @@ _help() { cat << EOUSAGE $description Usage: caff process_name +If process_name matches multiple running process, we pick up the first one. EOUSAGE } @@ -26,7 +27,7 @@ main() { } process_name=$1 - local vpid=$(pgrep "$process_name") + local vpid=$(pgrep "$process_name" | head -1) if [[ ! $vpid ]]; then print_warn "'$process_name' process not running" exit 1 From 424d754731c05af07462369e22f4a1b1c8373d8a Mon Sep 17 00:00:00 2001 From: codeforester Date: Thu, 20 Jun 2019 08:13:04 -0700 Subject: [PATCH 83/84] Improved messaging --- bin/caff | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/caff b/bin/caff index d1b942c..17f702d 100755 --- a/bin/caff +++ b/bin/caff @@ -36,7 +36,7 @@ main() { if [[ $cpid ]]; then caffeinate_pid=$(ps -o args -p "$cpid" | awk 'NR==2 {print $3}') if [[ $caffeinate_pid == $vpid ]]; then - printf '%s\n' "Alreading caffeinating, pid=$cpid" + printf '%s\n' "Alreading caffeinating: $process_name pid=$vpid, caffeinate pid=$cpid" exit 0 fi fi From 036d278d591d8eb3fbe79074fe4112e9913a77a0 Mon Sep 17 00:00:00 2001 From: codeforester Date: Fri, 28 Jun 2019 12:12:12 -0700 Subject: [PATCH 84/84] Added shopt_unset and shopt_show; fixed bugs --- lib/shopt.sh | 76 ++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 68 insertions(+), 8 deletions(-) diff --git a/lib/shopt.sh b/lib/shopt.sh index a7325c0..3945740 100644 --- a/lib/shopt.sh +++ b/lib/shopt.sh @@ -3,30 +3,90 @@ # in a clean way, preventing any side effects. # -declare -gA _shopt_restore +# +# associative array to hold state +# +declare -gA _shopt_restore + +# +# shopt set one or more options +# shopt_set() { - local opt count + local opt for opt; do if ! shopt -q "$opt"; then echo "$opt not set, setting it" shopt -s "$opt" _shopt_restore[$opt]=1 - ((count++)) else echo "$opt set already" fi done } -shopt_restore() { - local opt +# +# shopt unset one or more options +# +shopt_unset() { + local opt restore_type for opt; do - [[ ${_shopt_restore[$opt]} ]] && { + restore_type=${_shopt_restore[$opt]} + if shopt -q "$opt"; then + echo "$opt set, unsetting it" + shopt -u "$opt" + _shopt_restore[$opt]=2 + else + echo "$opt unset already" + fi + if [[ $restore_type == 1 ]]; then + unset _shopt_restore[$opt] + fi + done +} + +# +# restore one or more shopt options which were changed earlier; if no options passed, restore all +# +shopt_restore() { + local opt opts restore_type + if (($# > 0)); then + opts=("$@") + else + opts=("${!_shopt_restore[@]}") + fi + for opt in "${opts[@]}"; do + restore_type=${_shopt_restore[$opt]} + case $restore_type in + 1) echo "unsetting $opt" shopt -u "$opt" unset _shopt_restore[$opt] - } || { + ;; + 2) + echo "setting $opt" + shopt -s "$opt" + unset _shopt_restore[$opt] + ;; + *) echo "$opt wasn't changed earlier" - } + ;; + esac + done +} + +# +# shop what options set or unset currently +# +shopt_show() { + local opt restore_type + for opt in "${!_shopt_restore[@]}"; do + restore_type=${_shopt_restore[$opt]} + if [[ $restore_type == 1 ]]; then + echo "$opt set" + elif [[ $restore_type == 2 ]]; then + echo "$opt unset" + else + echo "$opt - unknown status '$restore_type'" + fi done }