From bf62d67339739b0c58da08ae0081f06c38818456 Mon Sep 17 00:00:00 2001 From: kebler Date: Fri, 30 Dec 2022 09:18:39 -0800 Subject: [PATCH] refactor shell environmnet so user can have create customized shell.env refactor default loading of networks --- README.md | 2 +- load.sh | 83 +++++++++++-------- module.lib | 2 +- ...ctory.func => shell-process-directory.mod} | 72 +++++++++++----- modules/utility/file.lib | 14 ++-- setup/user/.bashrc | 6 +- shell.env | 28 +++---- 7 files changed, 125 insertions(+), 82 deletions(-) rename modules/{shell-process-directory.func => shell-process-directory.mod} (61%) diff --git a/README.md b/README.md index 1c665a9..0386068 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ export BASH_SHELL_NETWORK=$BASH_SHELL/network export BASH_SHELL_HOST=$BASH_SHELL/host # by default SHELL sources will be looked for under $HOME/shell -# but can be user set below to $HOME/$BASH_SHELL_USER +# but can be user set below to BASH_SHELL_USER_DIR # export BASH_SHELL_USER= if there is a script setup.sh in the root of these directoies it will be run. If not then all files no matter how deep will be sourced in alpha order order. diff --git a/load.sh b/load.sh index d4a215c..66b0c88 100755 --- a/load.sh +++ b/load.sh @@ -1,30 +1,5 @@ #!/bin/bash -reload_shell () { - source $BASH_SHELL_BASE/load.sh $@ -} - -load_shell_host () { - module_load shell-process-directory - [[ $BASH_SHELL_HOST ]] && shell_process_directory $BASH_SHELL_HOST -} - -load_shell_user () { - module_load shell-process-directory - [[ -d $HOME/${BASH_SHELL_USER:-shell} ]] && shell_process_directory $HOME/${BASH_SHELL_USER:-shell} -} - -load_shell_dev () { - module_load shell-process-directory - [[ $BASH_SHELL_DEV ]] && shell_process_directory $BASH_SHELL_DEV -} - -load_shell_host_user_dev () { - load_shell_host - load_shell_user - load_shell_dev -} - # PRIMARY SHELL LOAD SCRIPT - RUN FOR ALL INTERACTIVE SHELLS # don't bother if bash is not the shell @@ -42,6 +17,42 @@ function debug () { } fi +reload_shell () { + source $BASH_SHELL_BASE/load.sh $@ +} + +load_custom_shell_env () { + [[ -f $BASH_SHELL_HOST/shell.env ]] && source $BASH_SHELL_HOST/shell.env + [[ -f $HOME/${BASH_SHELL_USER:-shell}/shell.env ]] && source $HOME/${BASH_SHELL_USER:-shell}/shell.env + [[ -f $BASH_SHELL_DEV/shell.env ]] && shell_process_directory $BASH_SHELL_DEV/shell.env +} + +load_shell_host () { + module_load shell-process-directory + [[ -d $BASH_SHELL_HOST ]] && shell_process_directory $BASH_SHELL_HOST +} + +load_shell_user () { + module_load shell-process-directory + BASH_SHELL_USER_DIR=${BASH_SHELL_USER_DIR:-$HOME/shell} + [[ -d $BASH_SHELL_USER_DIR ]] && shell_process_directory $BASH_SHELL_USER_DIR +} + +load_shell_dev () { + module_load shell-process-directory + [[ $BASH_SHELL_DEV ]] && shell_process_directory $BASH_SHELL_DEV +} + +load_shell_host_user_dev () { + load_shell_host + load_shell_user + load_shell_dev +} + +### START LOAD SCRIPT ##### + +load_custom_shell_env + ([[ $BASH_ENV ]] && [[ ! $- == *i* ]] && [[ $BASH_USE_ALIAS ]]) && shopt -s expand_aliases # process the base directory by default @@ -60,10 +71,10 @@ module_load shell-process-directory # shell_process_directory $BASH_SHELL_BASE # shell_process_directory $BASH_SHELL_ANY_HOST # shell_process_directory $BASH_SHELL_HOST - # export BASH_SHELL_BASE_LOADED=true - # process base any + # process base and any host and any network directories + # as set in shell.env for dir in ${1:-$BASH_SHELL_DIRS}; do # env | grep BASH # echo base $dir @@ -71,15 +82,19 @@ for dir in ${1:-$BASH_SHELL_DIRS}; do [[ "$dir" = "$BASH_SHELL_BASE" ]] && export BASH_SHELL_BASE_LOADED=true done -# set one or the other of these in shell.env if you want to load networks with every shell -if [[ $BASH_SHELL_HOME_NETWORK_LOAD ]] || [[ $BASH_SHELL_NETWORKS_LOAD ]] || [[ $BASH_SHELL_NETWORK ]] ; then - if [[ $BASH_SHELL_ANY_NETWORK ]]; then - module_load networks - [[ $(is_function _load_networks) ]] && _load_networks $BASH_SHELL_NETWORK - fi + +# # set one or the other of these in shell.env if you want to load networks with every shell +if [[ $BASH_SHELL_HOME_NETWORK_LOAD ]] || [[ $BASH_SHELL_ALL_NETWORKS_LOAD ]] || [[ $BASH_SHELL_NETWORKS_LOAD ]] ; then + module_load networks + if [[ $BASH_SHELL_ALL_NETWORKS_LOAD ]]; then + networks_load -a + else + [[ $BASH_SHELL_HOME_NETWORK_LOAD ]] && networks_load -h + fi + [[ $BASH_SHELL_NETWORKS_LOAD ]] && networks_load $BASH_SHELL_NETWORKS_LOAD fi -load_shell_host_user_dev +load_shell_host export BASH_SHELL_LOADED=true diff --git a/module.lib b/module.lib index cc2d7bd..960e8ea 100644 --- a/module.lib +++ b/module.lib @@ -56,7 +56,7 @@ fi # BASH_SHELL_DIRS holds shell directories to search for modules. If will be searched # in revsere order, user or network repos over host over base DIRS=( ${BASH_SHELL_DIRS:-$BASH_SHELL_BASE} ) -[ -d $HOME/$BASH_SHELL_USER ] && DIRS=("${DIRS[@]}" "$HOME/$BASH_SHELL_USER") +[ -d BASH_SHELL_USER_DIR ] && DIRS=("${DIRS[@]}" "BASH_SHELL_USER_DIR") [ -d $BASH_SHELL_DEV ] && DIRS=("${DIRS[@]}" "$BASH_SHELL_DEV") cnt=${#DIRS[@]} diff --git a/modules/shell-process-directory.func b/modules/shell-process-directory.mod similarity index 61% rename from modules/shell-process-directory.func rename to modules/shell-process-directory.mod index 5a9a2dc..87091e1 100644 --- a/modules/shell-process-directory.func +++ b/modules/shell-process-directory.mod @@ -1,5 +1,31 @@ #!/bin/bash +shell_source_subdirs () { + # default processing + [[ ! -d $1 ]] && echo no directory $1 from which to process subdirectories && return 1 + local DIR= + local SUBDIRS + local IGNORE_FILE + DIR=$1 + SUBDIRS=$([[ -f "$DIR/.bash-shell-include" ]] && cat "$DIR/.bash-shell-include" || cat "$BASH_SHELL_BASE/.bash-shell-include") + [[ $SSH_SESSION ]] && SUBDIRS+=" ssh/session" + IGNORE_FILE="$([[ -f "$DIR/.bash-shell-ignore" ]] && echo "$DIR" || echo "$BASH_SHELL_BASE")/.bash-shell-ignore" + # echo $DIR + # echo $SUBDIRS + for SUBDIR in $SUBDIRS; do + if [ -e "$DIR/$SUBDIR" ]; then + # echo processing subdirectory $DIR/$SUBDIR + # must quote all globs to avoid bash glob expansion which is likely on + # TODO have default set of ignores plus check for shell-ignore + # source_dir -p "archive" -x '"*.off" "*.md" "*TODO*" "LICENSE" "*.sample"' -d 0 $DIR/$SUBDIR + # source_dir -p "archive" -x "$excludes" -d 0 $DIR/$SUBDIR + source_dir -f "$IGNORE_FILE" -d 0 $DIR/$SUBDIR + # else + # echo no subdirectory $DIR/$SUBDIR to process, ignorning + fi + done +} + function shell_process_directory () { local SUBDIRS local DIR @@ -7,8 +33,8 @@ function shell_process_directory () { module_load file [[ $? -ne 0 ]] && echo unable to access the file module, aborting load && return 1 - DIR=${1:-$BASH_SHELL_BASE} + # echo sourcing directory $DIR # if [[ $DIR = "$BASH_SHELL_BASE" ]]; then # BASH_SHELL_IGNORE=$(shell_get_ignores) @@ -32,29 +58,31 @@ function shell_process_directory () { fi if [[ $DIR != "$BASH_SHELL_BASE" ]] && [[ -f $DIR/load.sh ]]; then - # echo "$DIR/load.sh" found, running instead of default load + # + echo "$DIR/load.sh" found, running instead of base load.sh script source "$DIR/load.sh" else - # default processing - local SUBDIRS - local IGNORE_FILE - SUBDIRS=$([[ -f "$DIR/.bash-shell-include" ]] && cat "$DIR/.bash-shell-include" || cat "$BASH_SHELL_BASE/.bash-shell-include") - [[ $SSH_SESSION ]] && SUBDIRS+=" ssh/session" - IGNORE_FILE="$([[ -f "$DIR/.bash-shell-ignore" ]] && echo "$DIR" || echo "$BASH_SHELL_BASE")/.bash-shell-ignore" - # echo $DIR - # echo $SUBDIRS - for SUBDIR in $SUBDIRS; do - if [ -e "$DIR/$SUBDIR" ]; then - # echo processing subdirectory $DIR/$SUBDIR - # must quote all globs to avoid bash glob expansion which is likely on - # TODO have default set of ignores plus check for shell-ignore - # source_dir -p "archive" -x '"*.off" "*.md" "*TODO*" "LICENSE" "*.sample"' -d 0 $DIR/$SUBDIR - # source_dir -p "archive" -x "$excludes" -d 0 $DIR/$SUBDIR - source_dir -f "$IGNORE_FILE" -d 0 $DIR/$SUBDIR - # else - # echo no subdirectory $DIR/$SUBDIR to process, ignorning - fi - done + shell_source_subdirs $DIR + # # default processing + # local SUBDIRS + # local IGNORE_FILE + # SUBDIRS=$([[ -f "$DIR/.bash-shell-include" ]] && cat "$DIR/.bash-shell-include" || cat "$BASH_SHELL_BASE/.bash-shell-include") + # [[ $SSH_SESSION ]] && SUBDIRS+=" ssh/session" + # IGNORE_FILE="$([[ -f "$DIR/.bash-shell-ignore" ]] && echo "$DIR" || echo "$BASH_SHELL_BASE")/.bash-shell-ignore" + # # echo $DIR + # # echo $SUBDIRS + # for SUBDIR in $SUBDIRS; do + # if [ -e "$DIR/$SUBDIR" ]; then + # # echo processing subdirectory $DIR/$SUBDIR + # # must quote all globs to avoid bash glob expansion which is likely on + # # TODO have default set of ignores plus check for shell-ignore + # # source_dir -p "archive" -x '"*.off" "*.md" "*TODO*" "LICENSE" "*.sample"' -d 0 $DIR/$SUBDIR + # # source_dir -p "archive" -x "$excludes" -d 0 $DIR/$SUBDIR + # source_dir -f "$IGNORE_FILE" -d 0 $DIR/$SUBDIR + # # else + # # echo no subdirectory $DIR/$SUBDIR to process, ignorning + # fi + # done fi # echo "done sourcing directory $DIR" # else diff --git a/modules/utility/file.lib b/modules/utility/file.lib index ecf8576..bd91279 100644 --- a/modules/utility/file.lib +++ b/modules/utility/file.lib @@ -14,9 +14,9 @@ isFile() { fi } - # env_file_pretty () { - -# } +#TODO + # env_file_pretty () { + # } # https://www.baeldung.com/linux/envsubst-command env_subs_file () { @@ -60,14 +60,16 @@ env_subs_file () { build_file () { # local file # echo build file $1 $2 + # todo merge no cr [[ $1 == "-f" ]] && file=true && shift 1 - [[ -f "$2" ]] || (iecho "output file $2 does not exist";return 1) + [[ -f "$2" ]] || { iecho "output file $2 does not exist"; return 1; } if [[ -f "$1" ]]; then - # echo $1 + # echo adding file $1 to $2 [[ $file ]] && echo -e "\n####### ADDED $1 ########" >> $2 # remove comment lines, remove blank last line cat "$1" | sed '/^\s*#/d' | sed '/^$/{:a;N;s/\n$//;ta}' >> $2 - else iecho "no such file $1 to append" + [[ ! $file ]] && echo -e "\n" >> $2 + else iecho "no such file $1 to append to $2" fi } diff --git a/setup/user/.bashrc b/setup/user/.bashrc index 876596d..a95ae83 100644 --- a/setup/user/.bashrc +++ b/setup/user/.bashrc @@ -11,9 +11,9 @@ if ( [[ $SHELL_INTERACTIVE ]] );then if ( [[ $BASH_SHELL_BASE_LOADED = true ]] ) ; then export BASH_SHELL_USER=${BASH_SHELL_USER:-"shell"} - # echo loading user $USER shell at $HOME/$BASH_SHELL_USER - [[ -d $HOME/$BASH_SHELL_USER ]] && shell_process_directory "$HOME/$BASH_SHELL_USER" ||\ - echo no user shell directory $HOME/$BASH_SHELL_USER to process, create one or clone a template + # echo loading user $USER shell at BASH_SHELL_USER_DIR + [[ -d BASH_SHELL_USER_DIR ]] && shell_process_directory "BASH_SHELL_USER_DIR" ||\ + echo no user shell directory BASH_SHELL_USER_DIR to process, create one or clone a template fi # uncomment to add non-interactive setup/sourcing # else diff --git a/shell.env b/shell.env index 53e4161..d3419d9 100755 --- a/shell.env +++ b/shell.env @@ -4,6 +4,10 @@ # In a nutshell its a set of directories that are sourced when creating a shell # The repos allow one to organize functionality across machines, users and networks +# In general do not change or edit this base shell.env file +# Instead add a custom shell.env to specific shell host directory, +# user shell directory or dev shell directory + # echo DEBUG: sourcing shell.env # This file gets sourced early in /etc/profile for all login and @@ -15,7 +19,6 @@ # with NO_BASH_SHELL_SSH=true # this does not effect non-interactive login shells like at user first login - # if bash is not installed then don't bother to continue ! command -v bash >/dev/null 2>&1 && echo no bash command && return 1 export SHELL=$(command -v bash ) @@ -98,41 +101,34 @@ BASH_SHELL_DEV=${BASH_SHELL_DEV:-/opt/shell} [[ -d $BASH_SHELL_DEV ]] && export BASH_SHELL_DEV # by default USER shell sources will be looked for under $HOME/shell -# but the default directory for ALL users can be set manually below -# export BASH_SHELL_USER= -export BASH_SHELL_USER=${BASH_SHELL_USER:-shell} -# or add this export to .bashrc for custom directory. This can be done during or after using the user setup script +# export BASH_SHELL_USER_DIR=$HOME/shell + # set up default location to look for other network shell directories BASH_NETWORKS_DIR=$parent/networks # BASH_NETWORKS_DIR= # alt directory to look for networks export BASH_NETWORKS_DIR -# set one or the other of these if you want to load networks with every shell -export BASH_SHELL_HOME_NETWORK_LOAD=true +# set one or the other of these here for all users or put in shell.env under HOST/USER/DEV directories +# if you want to load networks with every shell +# export BASH_SHELL_HOME_NETWORK_LOAD=true # export BASH_SHELL_NETWORKS_LOAD=true # export BASH_SHELL_NETWORK= -# export BASH_SHELL_NETWORK=238.kebler.net + # now load and export module loading functions library so it is always available source $BASH_SHELL_BASE/module.lib +# echo done shell.env # echo ALL DIRS: $BASH_SHELL_DIRS - -# cat $HOME/.bashrc -# source "$HOME/.bashrc" - # env | grep BASH # env | grep NETWORK_DIRS # echo --------------------------------- # echo $BASH_SHELL_DIRS # echo --------------------------------- -# echo end shell env - #archived ---for deletion or better explanation - # echo enabling aliases with non-interactive shell # DEPRECATED # export BASH_USE_ALIAS=true # will source aliases for non-interactive # if not using implicit sourcing for non-interactive shells then one can do this per script @@ -143,3 +139,5 @@ source $BASH_SHELL_BASE/module.lib # < your script code > # shopt -u expand_aliases #################### + +