2022-08-01 21:53:40 +00:00
|
|
|
#!/bin/zsh
|
2022-08-09 23:42:31 +00:00
|
|
|
export EXECUTION_DIR=$(pwd)
|
2023-02-22 01:44:27 +00:00
|
|
|
source "${0:a:h}/zsh/lib/import.driver.zsh" || exit 42
|
2022-08-09 23:42:31 +00:00
|
|
|
|
2022-08-01 21:53:40 +00:00
|
|
|
#####################################################################
|
|
|
|
|
|
|
|
__RUN() {
|
|
|
|
local USAGE='
|
2022-08-16 00:30:37 +00:00
|
|
|
usage: scwrypts [OPTIONS ...] SCRIPT -- [SCRIPT OPTIONS ...]
|
2022-08-01 21:53:40 +00:00
|
|
|
|
2022-08-16 00:30:37 +00:00
|
|
|
OPTIONS
|
2023-02-22 01:44:27 +00:00
|
|
|
-g, --group <group-name> only use scripts from the indicated group
|
|
|
|
-t, --type <type-name> only use scripts of the indicated type
|
|
|
|
-m, --name <scwrypt-name> only run the script if there is an exact match
|
|
|
|
(requires type and group)
|
|
|
|
|
2022-08-16 00:30:37 +00:00
|
|
|
-e, --env <env-name> set environment; overwrites SCWRYPTS_ENV
|
2023-02-22 01:44:27 +00:00
|
|
|
-n, --no-log skip logging and run in quiet mode
|
|
|
|
|
|
|
|
--update update scwrypts library to latest version
|
2022-08-01 21:53:40 +00:00
|
|
|
|
2023-02-22 01:44:27 +00:00
|
|
|
-v, --version print out scwrypts version and exit
|
|
|
|
-l, --list print out command list and exit
|
|
|
|
-h, --help display this message and exit
|
2022-08-16 00:30:37 +00:00
|
|
|
'
|
2022-08-01 21:53:40 +00:00
|
|
|
cd "$SCWRYPTS_ROOT"
|
|
|
|
|
|
|
|
local ENV_NAME="$SCWRYPTS_ENV"
|
|
|
|
local SEARCH_PATTERNS=()
|
|
|
|
|
2023-02-22 01:44:27 +00:00
|
|
|
local VARSPLIT SEARCH_GROUP SEARCH_TYPE SEARCH_NAME
|
|
|
|
|
2022-08-16 00:30:37 +00:00
|
|
|
local ERROR=0
|
2022-08-01 21:53:40 +00:00
|
|
|
|
|
|
|
while [[ $# -gt 0 ]]
|
|
|
|
do
|
|
|
|
case $1 in
|
2023-02-22 01:44:27 +00:00
|
|
|
-t | --type )
|
|
|
|
[ ! $2 ] && ERROR "missing value for argument $1" && break
|
|
|
|
SEARCH_TYPE=$2
|
|
|
|
shift 2
|
|
|
|
;;
|
|
|
|
-g | --group )
|
|
|
|
[ ! $2 ] && ERROR "missing value for argument $1" && break
|
|
|
|
SEARCH_GROUP=$2
|
|
|
|
shift 2
|
|
|
|
;;
|
|
|
|
-m | --name )
|
|
|
|
[ ! $2 ] && ERROR "missing value for argument $1" && break
|
|
|
|
SEARCH_NAME=$2
|
|
|
|
shift 2
|
|
|
|
;;
|
|
|
|
|
|
|
|
-[a-z][a-z]* )
|
|
|
|
VARSPLIT=$(echo "$1 " | sed 's/^\(-.\)\(.*\) /\1 -\2/')
|
|
|
|
set -- $(echo " $VARSPLIT ") ${@:2}
|
|
|
|
;;
|
2022-08-01 21:53:40 +00:00
|
|
|
-h | --help )
|
2023-02-22 01:44:27 +00:00
|
|
|
USAGE
|
2022-08-01 21:53:40 +00:00
|
|
|
return 0
|
|
|
|
;;
|
|
|
|
-n | --no-log )
|
|
|
|
[ ! $SUBSCWRYPT ] && SUBSCWRYPT=0
|
|
|
|
shift 1
|
|
|
|
;;
|
|
|
|
-e | --env )
|
2023-02-22 01:44:27 +00:00
|
|
|
[ ! $2 ] && ERROR "missing value for argument $1" && break
|
|
|
|
[ ! $SUBSCWRYPTS ] \
|
|
|
|
&& [ $ENV_NAME ] \
|
|
|
|
&& WARNING 'overwriting session environment' \
|
|
|
|
;
|
|
|
|
|
2022-08-01 21:53:40 +00:00
|
|
|
ENV_NAME="$2"
|
2023-02-22 01:44:27 +00:00
|
|
|
STATUS "using CLI environment '$ENV_NAME'"
|
2022-08-01 21:53:40 +00:00
|
|
|
shift 2
|
|
|
|
;;
|
|
|
|
-l | --list )
|
2023-02-22 01:44:27 +00:00
|
|
|
SCWRYPTS__GET_AVAILABLE_SCWRYPTS
|
|
|
|
return 0
|
|
|
|
;;
|
|
|
|
-v | --version )
|
|
|
|
echo scwrypts $(cd "$SCWRYPTS__ROOT__scwrypts"; git describe --tags)
|
|
|
|
return 0
|
|
|
|
;;
|
|
|
|
--update )
|
|
|
|
cd "$SCWRYPTS__ROOT__scwrypts"
|
|
|
|
git fetch --quiet origin main
|
|
|
|
local SYNC_STATUS=$?
|
|
|
|
|
|
|
|
git diff --exit-code origin/main -- . >&2
|
|
|
|
local DIFF_STATUS=$?
|
|
|
|
|
|
|
|
[[ $SYNC_STATUS -eq 0 ]] && [[ $DIFF_STATUS -eq 0 ]] && {
|
|
|
|
SUCCESS 'already up-to-date with origin/main'
|
|
|
|
} || {
|
|
|
|
git rebase --autostash origin/main \
|
|
|
|
&& SUCCESS 'up-to-date with origin/main' \
|
|
|
|
|| {
|
|
|
|
git rebase --abort
|
|
|
|
ERROR 'unable to update scwrypts; please try manual upgrade'
|
|
|
|
REMINDER "installation in '$(pwd)'"
|
|
|
|
}
|
|
|
|
}
|
2022-08-01 21:53:40 +00:00
|
|
|
return 0
|
|
|
|
;;
|
|
|
|
-- )
|
|
|
|
shift 1
|
|
|
|
break # pass arguments after '--' to the scwrypt
|
|
|
|
;;
|
2023-02-22 01:44:27 +00:00
|
|
|
--* )
|
|
|
|
ERROR "unrecognized argument '$1'"
|
2022-08-01 21:53:40 +00:00
|
|
|
shift 1
|
|
|
|
;;
|
|
|
|
* )
|
2023-02-22 01:44:27 +00:00
|
|
|
SEARCH_PATTERNS+=($1)
|
2022-08-01 21:53:40 +00:00
|
|
|
shift 1
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
|
2023-02-22 01:44:27 +00:00
|
|
|
[ $SEARCH_NAME ] && {
|
|
|
|
[ ! $SEARCH_TYPE ] && ERROR '--name requires --type argument'
|
|
|
|
[ ! $SEARCH_GROUP ] && ERROR '--name requires --group argument'
|
|
|
|
}
|
|
|
|
|
|
|
|
CHECK_ERRORS
|
2022-08-01 21:53:40 +00:00
|
|
|
|
|
|
|
##########################################
|
|
|
|
|
2023-02-22 01:44:27 +00:00
|
|
|
local SCWRYPTS_AVAILABLE
|
|
|
|
local POTENTIAL_ERROR="no such scwrypt exists:"
|
|
|
|
|
|
|
|
SCWRYPTS_AVAILABLE=$(SCWRYPTS__GET_AVAILABLE_SCWRYPTS)
|
|
|
|
|
|
|
|
[ $SEARCH_NAME ] && {
|
|
|
|
POTENTIAL_ERROR+="\n NAME : '$SEARCH_NAME'"
|
|
|
|
POTENTIAL_ERROR+="\n TYPE : '$SEARCH_TYPE'"
|
|
|
|
POTENTIAL_ERROR+="\n GROUP : '$SEARCH_GROUP'"
|
|
|
|
SCWRYPTS_AVAILABLE=$({
|
|
|
|
echo $SCWRYPTS_AVAILABLE | head -n1
|
|
|
|
echo $SCWRYPTS_AVAILABLE | sed -e 's/\x1b\[[0-9;]*m//g' | grep "^$SEARCH_NAME *$SEARCH_TYPE *$SEARCH_GROUP\$"
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
[ ! $SEARCH_NAME ] && {
|
|
|
|
[ $SEARCH_TYPE ] && {
|
|
|
|
POTENTIAL_ERROR+="\n TYPE : '$SEARCH_TYPE'"
|
|
|
|
SCWRYPTS_AVAILABLE=$(\
|
|
|
|
{
|
|
|
|
echo $SCWRYPTS_AVAILABLE | head -n1
|
|
|
|
echo $SCWRYPTS_AVAILABLE | grep ' [^/]*'$SEARCH_TYPE'[^/]* '
|
|
|
|
} \
|
|
|
|
| awk '{$2=""; print $0;}' \
|
|
|
|
| sed 's/ \+$/'$(printf $__COLOR_RESET)'/; s/ \+/^/g' \
|
|
|
|
| column -ts '^'
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
[ $SEARCH_GROUP ] && {
|
|
|
|
POTENTIAL_ERROR+="\n GROUP : '$SEARCH_GROUP'"
|
|
|
|
SCWRYPTS_AVAILABLE=$(
|
|
|
|
{
|
|
|
|
echo $SCWRYPTS_AVAILABLE | head -n1
|
|
|
|
echo $SCWRYPTS_AVAILABLE | grep "$SEARCH_GROUP"'[^/]*$'
|
|
|
|
} \
|
|
|
|
| awk '{$NF=""; print $0;}' \
|
|
|
|
| sed 's/ \+$/'$(printf $__COLOR_RESET)'/; s/ \+/^/g' \
|
|
|
|
| column -ts '^'
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
[[ ${#SEARCH_PATTERNS[@]} -gt 0 ]] && {
|
|
|
|
POTENTIAL_ERROR+="\n PATTERNS : $SEARCH_PATTERNS"
|
|
|
|
local P
|
|
|
|
for P in ${SEARCH_PATTERNS[@]}
|
|
|
|
do
|
|
|
|
SCWRYPTS_AVAILABLE=$(
|
|
|
|
{
|
|
|
|
echo $SCWRYPTS_AVAILABLE | head -n1
|
|
|
|
echo $SCWRYPTS_AVAILABLE | grep $P
|
|
|
|
}
|
|
|
|
)
|
|
|
|
done
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
[[ $(echo $SCWRYPTS_AVAILABLE | wc -l) -lt 2 ]] && ERROR "$POTENTIAL_ERROR"
|
|
|
|
|
|
|
|
CHECK_ERRORS
|
|
|
|
|
|
|
|
##########################################
|
|
|
|
|
|
|
|
local NAME="$SEARCH_NAME"
|
|
|
|
local TYPE="$SEARCH_TYPE"
|
|
|
|
local GROUP="$SEARCH_GROUP"
|
|
|
|
|
|
|
|
[[ $(echo $SCWRYPTS_AVAILABLE | wc -l) -eq 2 ]] \
|
|
|
|
&& SCWRYPT_SELECTION=$(echo $SCWRYPTS_AVAILABLE | tail -n1) \
|
|
|
|
|| SCWRYPT_SELECTION=$(echo $SCWRYPTS_AVAILABLE | FZF "select a script to run" --header-lines 1)
|
|
|
|
[ $SCWRYPT_SELECTION ] || exit 2
|
|
|
|
|
|
|
|
SCWRYPTS__SEPARATE_SCWRYPT_SELECTION $SCWRYPT_SELECTION
|
|
|
|
|
|
|
|
export SCWRYPT_NAME=$NAME
|
|
|
|
export SCWRYPT_TYPE=$TYPE
|
|
|
|
export SCWRYPT_GROUP=$GROUP
|
|
|
|
|
|
|
|
##########################################
|
2022-08-01 21:53:40 +00:00
|
|
|
|
|
|
|
local ENV_REQUIRED=$(__CHECK_ENV_REQUIRED && echo 1 || echo 0)
|
2023-08-22 20:20:03 +00:00
|
|
|
local REQUIRED_ENVIRONMENT_REGEX=$(eval echo '$SCWRYPTS_REQUIRED_ENVIRONMENT_REGEX__'$SCWRYPT_GROUP)
|
|
|
|
|
|
|
|
[ $REQUIRED_ENVIRONMENT_REGEX ] && {
|
|
|
|
[[ $ENV_NAME =~ $REQUIRED_ENVIRONMENT_REGEX ]] \
|
|
|
|
|| FAIL 5 "group '$SCWRYPT_GROUP' requires current environment to match '$REQUIRED_ENVIRONMENT_REGEX' (currently $ENV_NAME)"
|
|
|
|
}
|
2022-08-01 21:53:40 +00:00
|
|
|
|
|
|
|
[[ $ENV_REQUIRED -eq 1 ]] && {
|
2023-02-22 01:44:27 +00:00
|
|
|
[ ! $ENV_NAME ] && ENV_NAME=$(SCWRYPTS__SELECT_ENV)
|
2023-06-27 11:00:06 +00:00
|
|
|
for GROUP in ${SCWRYPTS_GROUPS[@]}
|
|
|
|
do
|
|
|
|
local ENV_FILE=$(SCWRYPTS__GET_ENV_FILE "$ENV_NAME" "$GROUP")
|
|
|
|
source "$ENV_FILE" || FAIL 5 "missing or invalid environment '$GROUP/$ENV_NAME'"
|
2023-08-18 18:40:14 +00:00
|
|
|
|
|
|
|
for f in $(eval 'echo $SCWRYPTS_STATIC_CONFIG__'$GROUP)
|
|
|
|
do
|
|
|
|
source "$f" || FAIL 5 "invalid static config '$f'"
|
|
|
|
done
|
2023-06-27 11:00:06 +00:00
|
|
|
done
|
2022-08-01 21:53:40 +00:00
|
|
|
|
|
|
|
export ENV_NAME
|
|
|
|
}
|
|
|
|
|
2023-08-22 20:20:03 +00:00
|
|
|
[ $REQUIRED_ENVIRONMENT_REGEX ] && {
|
|
|
|
[[ $ENV_NAME =~ $REQUIRED_ENVIRONMENT_REGEX ]] \
|
|
|
|
|| FAIL 5 "group '$SCWRYPT_GROUP' requires current environment to match '$REQUIRED_ENVIRONMENT_REGEX' (currently $ENV_NAME)"
|
|
|
|
}
|
2023-06-22 21:48:57 +00:00
|
|
|
|
2023-02-22 01:44:27 +00:00
|
|
|
##########################################
|
|
|
|
|
2022-08-01 21:53:40 +00:00
|
|
|
[ ! $SUBSCWRYPT ] \
|
|
|
|
&& [[ $ENV_NAME =~ prod ]] \
|
2023-02-22 01:44:27 +00:00
|
|
|
&& { __VALIDATE_UPSTREAM_TIMELINE || ABORT; }
|
2022-08-01 21:53:40 +00:00
|
|
|
|
2023-02-22 01:44:27 +00:00
|
|
|
##########################################
|
|
|
|
|
|
|
|
local RUN_STRING=$(SCWRYPTS__GET_RUNSTRING $SCWRYPT_NAME $SCWRYPT_TYPE $SCWRYPT_GROUP)
|
2022-08-01 21:53:40 +00:00
|
|
|
[ ! $RUN_STRING ] && exit 3
|
|
|
|
|
|
|
|
##########################################
|
|
|
|
|
2023-06-22 23:57:17 +00:00
|
|
|
local LOGFILE=$(__GET_LOGFILE)
|
2022-08-01 21:53:40 +00:00
|
|
|
|
|
|
|
local HEADER=$(
|
|
|
|
[ $SUBSCWRYPT ] && return 0
|
|
|
|
echo '====================================================================='
|
2023-02-22 01:44:27 +00:00
|
|
|
echo "script : $SCWRYPT_GROUP $SCWRYPT_TYPE $SCWRYPT_NAME"
|
2022-08-01 21:53:40 +00:00
|
|
|
echo "run at : $(date)"
|
|
|
|
echo "config : $ENV_NAME"
|
|
|
|
[ ! $LOGFILE ] && echo '\033[1;33m------------------------------------------\033[0m'
|
|
|
|
)
|
|
|
|
|
|
|
|
[ ! $LOGFILE ] && {
|
|
|
|
[ $HEADER ] && echo $HEADER
|
2022-08-09 23:42:31 +00:00
|
|
|
[ $SUBSCWRYPT ] && {
|
2023-01-12 00:09:59 +00:00
|
|
|
eval "$RUN_STRING $(printf "%q " "$@")"
|
2022-08-01 21:53:40 +00:00
|
|
|
exit $?
|
|
|
|
} || {
|
2023-01-12 00:09:59 +00:00
|
|
|
eval "$RUN_STRING $(printf "%q " "$@")" </dev/tty >/dev/tty 2>&1
|
2022-08-01 21:53:40 +00:00
|
|
|
exit $?
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
[ $HEADER ] && echo $HEADER
|
|
|
|
echo '\033[1;33m--- BEGIN OUTPUT -------------------------\033[0m'
|
2023-01-12 00:09:59 +00:00
|
|
|
eval "$RUN_STRING $(printf "%q " "$@")"
|
2022-08-01 21:53:40 +00:00
|
|
|
EXIT_CODE=$?
|
|
|
|
echo '\033[1;33m--- END OUTPUT ---------------------------\033[0m'
|
|
|
|
|
|
|
|
[[ $EXIT_CODE -eq 0 ]] && EXIT_COLOR='32m' || EXIT_COLOR='31m'
|
|
|
|
|
|
|
|
echo "terminated with\\033[1;$EXIT_COLOR code $EXIT_CODE\\033[0m"
|
|
|
|
} 2>&1 | tee --append "$LOGFILE"
|
|
|
|
|
|
|
|
exit $(\
|
|
|
|
sed -n 's/^terminated with.*code \([0-9]*\).*$/\1/p' $LOGFILE \
|
|
|
|
| tail -n1
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
#####################################################################
|
|
|
|
|
|
|
|
__CHECK_ENV_REQUIRED() {
|
|
|
|
[ $CI ] && return 1
|
|
|
|
|
2023-02-22 01:44:27 +00:00
|
|
|
echo $SCWRYPT_NAME | grep -q 'scwrypts/logs/' && return 1
|
|
|
|
echo $SCWRYPT_NAME | grep -q 'scwrypts/environment/' && return 1
|
2022-08-01 21:53:40 +00:00
|
|
|
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
|
|
|
|
__VALIDATE_UPSTREAM_TIMELINE() {
|
2023-02-22 01:44:27 +00:00
|
|
|
STATUS "on '$ENV_NAME'; checking diff against origin/main"
|
2022-08-01 21:53:40 +00:00
|
|
|
|
|
|
|
git fetch --quiet origin main
|
|
|
|
local SYNC_STATUS=$?
|
|
|
|
|
|
|
|
git diff --exit-code origin/main -- . >&2
|
|
|
|
local DIFF_STATUS=$?
|
|
|
|
|
|
|
|
[[ $SYNC_STATUS -eq 0 ]] && [[ $DIFF_STATUS -eq 0 ]] && {
|
2023-02-22 01:44:27 +00:00
|
|
|
SUCCESS 'up-to-date with origin/main'
|
2022-08-01 21:53:40 +00:00
|
|
|
} || {
|
2023-02-22 01:44:27 +00:00
|
|
|
WARNING
|
|
|
|
[[ $SYNC_STATUS -ne 0 ]] && WARNING 'unable to synchronize with origin/main'
|
|
|
|
[[ $DIFF_STATUS -ne 0 ]] && WARNING 'your branch differs from origin/main (diff listed above)'
|
|
|
|
WARNING
|
2022-08-01 21:53:40 +00:00
|
|
|
|
2023-02-22 01:44:27 +00:00
|
|
|
yN 'continue?' || return 1
|
2022-08-01 21:53:40 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
__GET_LOGFILE() {
|
|
|
|
[ $SUBSCWRYPT ] \
|
2023-06-22 23:57:17 +00:00
|
|
|
|| [[ $SCWRYPT_NAME =~ scwrypts/logs ]] \
|
|
|
|
|| [[ $SCWRYPT_NAME =~ interactive ]] \
|
2022-08-01 21:53:40 +00:00
|
|
|
&& return 0
|
|
|
|
|
2023-02-22 01:44:27 +00:00
|
|
|
echo "$SCWRYPTS_LOG_PATH/$(echo $GROUP/$TYPE/$NAME | sed 's/^\.\///; s/\//\%/g').log"
|
2022-08-01 21:53:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#####################################################################
|
|
|
|
__RUN $@
|