Compare commits
12 Commits
Author | SHA1 | Date | |
---|---|---|---|
ab567f6950 | |||
e199e9bf91 | |||
4c161aba49 | |||
3ea2e0cd8f | |||
e0cbf58b3c | |||
09c214f939 | |||
e2c6007a65 | |||
620d07f1a8 | |||
4baacd9c32 | |||
6c546ebb6f | |||
9783119a7d | |||
a94d6bc197 |
@ -3,18 +3,22 @@ export AWS_ACCOUNT=
|
||||
export AWS_PROFILE=
|
||||
export AWS_REGION=
|
||||
export AWS__EFS__LOCAL_MOUNT_POINT=
|
||||
export AWS__S3__MEDIA_BUCKET=
|
||||
export AWS__S3__MEDIA_TARGETS=
|
||||
export DIRECTUS__API_TOKEN=
|
||||
export DIRECTUS__BASE_URL=
|
||||
export DISCORD__BOT_TOKEN=
|
||||
export DISCORD__CONTENT_FOOTER=
|
||||
export DISCORD__CONTENT_HEADER=
|
||||
export DISCORD__DEFAULT_AVATAR_URL=
|
||||
export DISCORD__DEFAULT_CHANNEL_ID=
|
||||
export DISCORD__DEFAULT_USERNAME=
|
||||
export DISCORD__DEFAULT_WEBHOOK=
|
||||
export I3__BORDER_PIXEL_SIZE=
|
||||
export I3__DMENU_FONT_SIZE=
|
||||
export I3__GLOBAL_FONT_SIZE=
|
||||
export I3__MODEL_CONFIG=
|
||||
export LINEAR__API_TOKEN=
|
||||
export MEDIA_SYNC__S3_BUCKET
|
||||
export MEDIA_SYNC__TARGETS
|
||||
export REDIS_AUTH=
|
||||
export REDIS_HOST=
|
||||
export REDIS_PORT=
|
@ -4,15 +4,16 @@ AWS_REGION |
|
||||
|
||||
AWS__EFS__LOCAL_MOUNT_POINT | fully-qualified path to mount the EFS drive
|
||||
|
||||
AWS__S3__MEDIA_BUCKET | s3 bucket name and filesystem targets for media backups
|
||||
AWS__S3__MEDIA_TARGETS |
|
||||
|
||||
DIRECTUS__API_TOKEN | details for a directus instance
|
||||
DIRECTUS__BASE_URL |
|
||||
|
||||
DISCORD__BOT_TOKEN | details for discord bot
|
||||
DISCORD__CONTENT_HEADER |
|
||||
DISCORD__CONTENT_FOOTER |
|
||||
DISCORD__DEFAULT_AVATAR_URL |
|
||||
DISCORD__DEFAULT_CHANNEL_ID |
|
||||
DISCORD__DEFAULT_USERNAME |
|
||||
DISCORD__DEFAULT_WEBHOOK |
|
||||
|
||||
I3__BORDER_PIXEL_SIZE | custom i3 configuration settings
|
||||
I3__DMENU_FONT_SIZE |
|
||||
@ -21,6 +22,9 @@ I3__MODEL_CONFIG |
|
||||
|
||||
LINEAR__API_TOKEN | linear.app project management configuration
|
||||
|
||||
MEDIA_SYNC__S3_BUCKET | s3 bucket name and filesystem targets for media backups
|
||||
MEDIA_SYNC__TARGETS |
|
||||
|
||||
REDIS_AUTH | redis connection credentials
|
||||
REDIS_HOST |
|
||||
REDIS_PORT |
|
2
plugins/kubectl/.config/env.template
Normal file
2
plugins/kubectl/.config/env.template
Normal file
@ -0,0 +1,2 @@
|
||||
#!/bin/zsh
|
||||
export SCWRYPTS_KUBECTL_REDIS=
|
1
plugins/kubectl/.config/env.template.descriptions
Normal file
1
plugins/kubectl/.config/env.template.descriptions
Normal file
@ -0,0 +1 @@
|
||||
SCWRYPTS_KUBECTL_REDIS | (currently only 'managed') 'managed' or 'custom' redis configuration
|
4
plugins/kubectl/.config/static/redis.zsh
Normal file
4
plugins/kubectl/.config/static/redis.zsh
Normal file
@ -0,0 +1,4 @@
|
||||
export SCWRYPTS_KUBECTL_REDIS_HOST__managed=127.0.0.1
|
||||
export SCWRYPTS_KUBECTL_REDIS_PORT__managed=26379
|
||||
export SCWRYPTS_KUBECTL_REDIS_AUTH__managed=
|
||||
export SCWRYPTS_KUBECTL_REDIS_KEY_PREFIX__managed=
|
10
plugins/kubectl/README.md
Normal file
10
plugins/kubectl/README.md
Normal file
@ -0,0 +1,10 @@
|
||||
# Kubernetes `kubectl` Helper Plugin
|
||||
|
||||
Leverages a local `redis` application to quickly and easily set an alias `k` for `kubectl --context <some-context> --namespace <some-namespace>`.
|
||||
Much like scwrypts environments, `k` aliases are *only* shared amongst session with the same `SCWRYPTS_ENV` to prevent accidental cross-contamination.
|
||||
|
||||
|
||||
## Getting Started
|
||||
|
||||
Enable the plugin in `~/.config/scwrypts/config.zsh` by adding `SCWRYPTS_PLUGIN_ENABLED__KUBECTL=1`.
|
||||
Use `k` as your new `kubectl` and checkout `k --help` and `k meta --help`.
|
16
plugins/kubectl/get-context
Executable file
16
plugins/kubectl/get-context
Executable file
@ -0,0 +1,16 @@
|
||||
#!/bin/zsh
|
||||
#####################################################################
|
||||
DEPENDENCIES+=()
|
||||
REQUIRED_ENV+=()
|
||||
|
||||
use kubectl --group kubectl
|
||||
|
||||
CHECK_ENVIRONMENT
|
||||
#####################################################################
|
||||
|
||||
MAIN() {
|
||||
KUBECTL__GET_CONTEXT
|
||||
}
|
||||
|
||||
#####################################################################
|
||||
MAIN $@
|
16
plugins/kubectl/get-namespace
Executable file
16
plugins/kubectl/get-namespace
Executable file
@ -0,0 +1,16 @@
|
||||
#!/bin/zsh
|
||||
#####################################################################
|
||||
DEPENDENCIES+=()
|
||||
REQUIRED_ENV+=()
|
||||
|
||||
use kubectl --group kubectl
|
||||
|
||||
CHECK_ENVIRONMENT
|
||||
#####################################################################
|
||||
|
||||
MAIN() {
|
||||
KUBECTL__GET_NAMESPACE
|
||||
}
|
||||
|
||||
#####################################################################
|
||||
MAIN $@
|
31
plugins/kubectl/kubectl.driver.completion.zsh
Normal file
31
plugins/kubectl/kubectl.driver.completion.zsh
Normal file
@ -0,0 +1,31 @@
|
||||
#####################################################################
|
||||
command -v compdef >/dev/null 2>&1 || return 0
|
||||
#####################################################################
|
||||
|
||||
_k() {
|
||||
local C=$(k meta get context)
|
||||
local NS=$(k meta get namespace)
|
||||
|
||||
local KUBEWORDS=(kubectl)
|
||||
[ $C ] && KUBEWORDS+=(--context $C)
|
||||
[ $NS ] && KUBEWORDS+=(--namespace $NS)
|
||||
|
||||
words="$KUBEWORDS ${words[@]:1}"
|
||||
_kubectl
|
||||
}
|
||||
|
||||
compdef _k k
|
||||
|
||||
#####################################################################
|
||||
_h() {
|
||||
local C=$(k meta get context)
|
||||
local NS=$(k meta get namespace)
|
||||
|
||||
local KUBEWORDS=(kubectl)
|
||||
[ $C ] && KUBEWORDS+=(--context $C)
|
||||
[ $NS ] && KUBEWORDS+=(--namespace $NS)
|
||||
|
||||
words="$KUBEWORDS ${words[@]:1}"
|
||||
_helm
|
||||
}
|
||||
compdef _h h
|
173
plugins/kubectl/kubectl.driver.zsh
Normal file
173
plugins/kubectl/kubectl.driver.zsh
Normal file
@ -0,0 +1,173 @@
|
||||
[[ $SCWRYPTS_KUBECTL_DRIVER_READY -eq 1 ]] && return 0
|
||||
|
||||
k() { _SCWRYPTS_KUBECTL_DRIVER kubectl $@; }
|
||||
h() { _SCWRYPTS_KUBECTL_DRIVER helm $@; }
|
||||
|
||||
_SCWRYPTS_KUBECTL_DRIVER() {
|
||||
[ ! $SCWRYPTS_ENV ] && {
|
||||
ERROR "must set SCWRYPTS_ENV in order to use '$(echo $CLI | head -c1)'"
|
||||
return 1
|
||||
}
|
||||
|
||||
which REDIS >/dev/null 2>&1 \
|
||||
|| eval "$(scwrypts -n --name meta/get-static-redis-definition --type zsh --group kubectl)"
|
||||
|
||||
local CLI="$1"; shift 1
|
||||
|
||||
local SCWRYPTS_GROUP CUSTOM_COMMANDS=(meta)
|
||||
for SCWRYPTS_GROUP in ${SCWRYPTS_GROUPS[@]}
|
||||
do
|
||||
CUSTOM_COMMANDS+=($(eval echo '$SCWRYPTS_KUBECTL_CUSTOM_COMMANDS__'$SCWRYPTS_GROUP))
|
||||
done
|
||||
|
||||
##########################################
|
||||
|
||||
local USAGE_ARGS="$(for C in ${CUSTOM_COMMANDS[@]}; do echo " - $C"; done)"
|
||||
local USAGE_OPTIONS="
|
||||
-n, --namespace set the namespace for commands in '$SCWRYPTS_ENV'
|
||||
-k, --context set the context for commands in '$SCWRYPTS_ENV'
|
||||
"
|
||||
local DESCRIPTION="
|
||||
Provides 'k' (kubectl) and 'h' (helm) shorthands to the
|
||||
respective utility. These functions leverage redis and scwrypts
|
||||
environments to allow quick selection of contexts and namespaces
|
||||
usable across all active shell instances.
|
||||
|
||||
The scwrypts group 'kubectl' has simple selection executables
|
||||
for kubecontext and namespace, but also provides the library to
|
||||
enable enriched, use-case-sensitive setup of kubernetes context.
|
||||
"
|
||||
|
||||
local USAGE="
|
||||
usage: $(echo $CLI | head -c1) [...args...] [...options...] -- [...$CLI options...]
|
||||
|
||||
args: -
|
||||
|
||||
options: -
|
||||
-h, --help display this help dialogue
|
||||
-v, --verbose output debugging information
|
||||
|
||||
DESCRIPTION
|
||||
"
|
||||
|
||||
##########################################
|
||||
|
||||
local USER_ARGS=()
|
||||
|
||||
local CUSTOM_COMMAND=0
|
||||
PARAMETER_OVERRIDES+=
|
||||
local VERBOSE=0
|
||||
|
||||
while [[ $# -gt 0 ]]
|
||||
do
|
||||
case $1 in
|
||||
-v | --verbose ) VERBOSE=1 ;;
|
||||
-n | --namespace )
|
||||
echo "TODO: set namespace ('$2')" >&2
|
||||
USER_ARGS+=(--namespace $2); shift 1
|
||||
;;
|
||||
|
||||
-k | --context | --kube-context )
|
||||
echo "TODO: set context ('$2')" >&2
|
||||
[[ $CLI =~ ^helm$ ]] && USER_ARGS+=(--kube-context $2)
|
||||
[[ $CLI =~ ^kubectl$ ]] && USER_ARGS+=(--context $2)
|
||||
shift 1
|
||||
;;
|
||||
|
||||
meta )
|
||||
CUSTOM_COMMAND=meta
|
||||
USAGE_ARGS=" - get\n - set"
|
||||
USAGE_OPTIONS=''
|
||||
DESCRIPTION="perform meta-operations on $(echo $CLI | head -c1) for '$SCWRYPTS_ENV'"
|
||||
|
||||
case $2 in
|
||||
-h | --help ) HELP=1 ;;
|
||||
|
||||
set )
|
||||
USAGE_ARGS=" set (namespace|context)"
|
||||
DESCRIPTION="interactively set a namespace or context for '$SCWRYPTS_ENV'"
|
||||
case $3 in
|
||||
namespace | context ) USER_ARGS+=($2 $3) ;;
|
||||
-h | --help ) HELP=1 ;;
|
||||
|
||||
* ) ERROR "cannot set '$3'" >&2 ;;
|
||||
esac
|
||||
shift 1
|
||||
;;
|
||||
|
||||
get )
|
||||
USAGE_ARGS=" get (namespace|context)"
|
||||
DESCRIPTION="output the current namespace or context for '$SCWRYPTS_ENV'"
|
||||
case $3 in
|
||||
namespace | context ) USER_ARGS+=($2 $3) ;;
|
||||
-h | --help ) HELP=1 ;;
|
||||
|
||||
* ) ERROR "cannot get '$3'" >&2 ;;
|
||||
esac
|
||||
shift 1
|
||||
;;
|
||||
esac
|
||||
shift 1
|
||||
;;
|
||||
|
||||
-h | --help ) HELP=1 ;;
|
||||
-- ) shift 1; break ;;
|
||||
* ) USER_ARGS+=($1) ;;
|
||||
esac
|
||||
shift 1
|
||||
done
|
||||
|
||||
while [[ $# -gt 0 ]]; do USER_ARGS+=($1); shift 1; done
|
||||
|
||||
|
||||
CHECK_ERRORS --no-fail 2>&1 | sed 's/scwrypts -- //' >&2 || return 1
|
||||
|
||||
[[ $HELP -eq 1 ]] && {
|
||||
[[ ! $CUSTOM_COMMAND =~ ^0$ ]] \
|
||||
&& USAGE=$(echo $USAGE | sed "s/[[]\\.\\.\\.args\\.\\.\\.[]]/$CUSTOM_COMMAND &/")
|
||||
|
||||
USAGE=$(echo $USAGE | perl -pe "
|
||||
s/args: -/args:\n$USAGE_ARGS/;
|
||||
s^options: -^options:$USAGE_OPTIONS^;
|
||||
s/DESCRIPTION/$DESCRIPTION/;
|
||||
")
|
||||
|
||||
USAGE 2>&1 | sed 's/scwrypts -- //' >&2
|
||||
return 0
|
||||
}
|
||||
|
||||
#####################################################################
|
||||
|
||||
case $CUSTOM_COMMAND in
|
||||
0 )
|
||||
local CLI_ARGS=()
|
||||
|
||||
local CONTEXT=$(k meta get context)
|
||||
local NAMESPACE=$(k meta get namespace)
|
||||
|
||||
[ $CONTEXT ] && [[ $CLI =~ ^helm$ ]] && CLI_ARGS+=(--kube-context $CONTEXT)
|
||||
[ $CONTEXT ] && [[ $CLI =~ ^kubectl$ ]] && CLI_ARGS+=(--context $CONTEXT)
|
||||
|
||||
[ $NAMESPACE ] && CLI_ARGS+=(--namespace $NAMESPACE)
|
||||
[[ $VERBOSE -eq 1 ]] && {
|
||||
INFO "
|
||||
using context '$CONTEXT'
|
||||
using namespace '$NAMESPACE'
|
||||
"
|
||||
STATUS "running $CLI ${CLI_ARGS[@]} ${USER_ARGS[@]}"
|
||||
}
|
||||
$CLI ${CLI_ARGS[@]} ${USER_ARGS[@]}
|
||||
;;
|
||||
* ) eval 'SCWRYPTS_KUBECTL_CUSTOM_COMMAND__'$CUSTOM_COMMAND ${USER_ARGS[@]} ;;
|
||||
esac
|
||||
}
|
||||
|
||||
SCWRYPTS_KUBECTL_CUSTOM_COMMAND__meta() {
|
||||
case $1 in
|
||||
get ) REDIS get --prefix current:$2; return 0 ;;
|
||||
set ) scwrypts --name set-$2 --type zsh --group kubectl ;;
|
||||
esac
|
||||
}
|
||||
|
||||
#####################################################################
|
||||
source ${0:a:h}/kubectl.driver.completion.zsh
|
11
plugins/kubectl/kubectl.scwrypts.zsh
Normal file
11
plugins/kubectl/kubectl.scwrypts.zsh
Normal file
@ -0,0 +1,11 @@
|
||||
SCWRYPTS_GROUPS+=(kubectl)
|
||||
|
||||
export SCWRYPTS_TYPE__kubectl=zsh
|
||||
export SCWRYPTS_ROOT__kubectl="$SCWRYPTS_ROOT__scwrypts/plugins/kubectl"
|
||||
export SCWRYPTS_COLOR__kubectl='\033[0;31m'
|
||||
|
||||
SCWRYPTS_STATIC_CONFIG__kubectl+=(
|
||||
"$SCWRYPTS_ROOT__kubectl/.config/static/redis.zsh"
|
||||
)
|
||||
|
||||
source "$SCWRYPTS_ROOT__kubectl/kubectl.driver.zsh"
|
79
plugins/kubectl/lib/kubectl.module.zsh
Normal file
79
plugins/kubectl/lib/kubectl.module.zsh
Normal file
@ -0,0 +1,79 @@
|
||||
#####################################################################
|
||||
|
||||
DEPENDENCIES+=(
|
||||
kubectl
|
||||
)
|
||||
|
||||
REQUIRED_ENV+=()
|
||||
|
||||
use redis --group kubectl
|
||||
|
||||
#####################################################################
|
||||
|
||||
KUBECTL() {
|
||||
local NAMESPACE=$(REDIS get --prefix "current:namespace")
|
||||
local CONTEXT=$(KUBECTL__GET_CONTEXT)
|
||||
|
||||
local KUBECTL_ARGS=()
|
||||
[ $NAMESPACE ] && KUBECTL_ARGS+=(--namespace $NAMESPACE)
|
||||
[ $CONTEXT ] && KUBECTL_ARGS+=(--context $CONTEXT)
|
||||
|
||||
kubectl ${KUBECTL_ARGS[@]} $@
|
||||
}
|
||||
|
||||
|
||||
#####################################################################
|
||||
|
||||
KUBECTL__GET_CONTEXT() { REDIS get --prefix "current:context"; }
|
||||
|
||||
KUBECTL__SET_CONTEXT() {
|
||||
local CONTEXT=$1
|
||||
[ ! $CONTEXT ] && return 1
|
||||
|
||||
[[ $CONTEXT =~ default ]] && {
|
||||
: \
|
||||
&& REDIS del --prefix "current:context" \
|
||||
&& KUBECTL__SET_NAMESPACE default \
|
||||
;
|
||||
return $?
|
||||
}
|
||||
|
||||
: \
|
||||
&& REDIS set --prefix "current:context" "$CONTEXT" \
|
||||
&& KUBECTL__SET_NAMESPACE default \
|
||||
;
|
||||
}
|
||||
|
||||
KUBECTL__SELECT_CONTEXT() {
|
||||
KUBECTL__LIST_CONTEXTS | FZF 'select a context'
|
||||
}
|
||||
|
||||
KUBECTL__LIST_CONTEXTS() {
|
||||
echo default
|
||||
KUBECTL config get-contexts -o name | sort
|
||||
}
|
||||
|
||||
#####################################################################
|
||||
|
||||
KUBECTL__GET_NAMESPACE() { REDIS get --prefix "current:namespace"; }
|
||||
|
||||
KUBECTL__SET_NAMESPACE() {
|
||||
local NAMESPACE=$1
|
||||
[ ! $NAMESPACE ] && return 1
|
||||
|
||||
[[ $NAMESPACE =~ default ]] && {
|
||||
REDIS del --prefix "current:namespace"
|
||||
return $?
|
||||
}
|
||||
|
||||
REDIS set --prefix "current:namespace" "$NAMESPACE"
|
||||
}
|
||||
|
||||
KUBECTL__SELECT_NAMESPACE() {
|
||||
KUBECTL__LIST_NAMESPACES | FZF 'select a namespace'
|
||||
}
|
||||
|
||||
KUBECTL__LIST_NAMESPACES() {
|
||||
echo default
|
||||
KUBECTL get namespaces -o name | sed 's/^namespace\///' | sort
|
||||
}
|
90
plugins/kubectl/lib/redis.module.zsh
Normal file
90
plugins/kubectl/lib/redis.module.zsh
Normal file
@ -0,0 +1,90 @@
|
||||
#####################################################################
|
||||
|
||||
DEPENDENCIES+=(
|
||||
redis-cli
|
||||
docker
|
||||
)
|
||||
|
||||
# TODO; allow custom redis configuration
|
||||
export SCWRYPTS_KUBECTL_REDIS=managed
|
||||
|
||||
REQUIRED_ENV+=(
|
||||
SCWRYPTS_KUBECTL_REDIS
|
||||
)
|
||||
|
||||
#####################################################################
|
||||
|
||||
REDIS() {
|
||||
[ ! $USAGE ] && local USAGE="
|
||||
usage: [...options...]
|
||||
|
||||
options:
|
||||
-p, --prefix apply dynamic prefix to the next command line argument
|
||||
|
||||
--get-prefix output key prefix for current session
|
||||
--get-static-definition output the static ZSH function definition for REDIS
|
||||
|
||||
other arguments are passed through to redis-cli
|
||||
"
|
||||
local REDIS_ARGS=() USER_ARGS=()
|
||||
local REDIS_PREFIX=$(eval echo '$SCWRYPTS_KUBECTL_REDIS_KEY_PREFIX__'$SCWRYPTS_KUBECTL_REDIS)
|
||||
|
||||
local ECHO_STATIC_DEFINITION=0
|
||||
|
||||
while [[ $# -gt 0 ]]
|
||||
do
|
||||
case $1 in
|
||||
-p | --prefix ) USER_ARGS+=("${SCWRYPTS_ENV}:${REDIS_PREFIX}$2"); shift 1 ;;
|
||||
|
||||
--get-prefix ) echo $REDIS_PREFIX; return 0 ;;
|
||||
--get-static-definition ) ECHO_STATIC_DEFINITION=1 ;;
|
||||
|
||||
* ) USER_ARGS+=($1) ;;
|
||||
esac
|
||||
shift 1
|
||||
done
|
||||
|
||||
local REDIS_HOST=$(eval echo '$SCWRYPTS_KUBECTL_REDIS_HOST__'$SCWRYPTS_KUBECTL_REDIS)
|
||||
local REDIS_PORT=$(eval echo '$SCWRYPTS_KUBECTL_REDIS_PORT__'$SCWRYPTS_KUBECTL_REDIS)
|
||||
local REDIS_AUTH=$(eval echo '$SCWRYPTS_KUBECTL_REDIS_AUTH__'$SCWRYPTS_KUBECTL_REDIS)
|
||||
|
||||
[ $REDIS_HOST ] && REDIS_ARGS+=(-h $REDIS_HOST)
|
||||
[ $REDIS_PORT ] && REDIS_ARGS+=(-p $REDIS_PORT)
|
||||
[ $REDIS_AUTH ] && REDIS_ARGS+=(-a $REDIS_AUTH)
|
||||
|
||||
REDIS_ARGS+=(--raw)
|
||||
|
||||
[[ $ECHO_STATIC_DEFINITION -eq 1 ]] && {
|
||||
echo "REDIS() {\
|
||||
local USER_ARGS=(); \
|
||||
while [[ \$# -gt 0 ]]; \
|
||||
do \
|
||||
case \$1 in
|
||||
-p | --prefix ) USER_ARGS+=(\"\${SCWRYPTS_ENV}:${REDIS_PREFIX}\$2\"); shift 1 ;; \
|
||||
* ) USER_ARGS+=(\$1) ;; \
|
||||
esac; \
|
||||
shift 1; \
|
||||
done; \
|
||||
redis-cli ${REDIS_ARGS[@]} \${USER_ARGS[@]}; \
|
||||
}" | sed 's/\s\+/ /g'
|
||||
return 0
|
||||
}
|
||||
|
||||
redis-cli ${REDIS_ARGS[@]} ${USER_ARGS[@]}
|
||||
}
|
||||
|
||||
|
||||
REDIS ping | grep -qi pong || {
|
||||
RPID=$(docker ps -a | grep scwrypts-kubectl-redis | awk '{print $1;}')
|
||||
[ $RPID ] && STATUS 'refreshing redis instance' && docker rm -f $RPID
|
||||
unset RPID
|
||||
|
||||
docker run \
|
||||
--detach \
|
||||
--name scwrypts-kubectl-redis \
|
||||
--publish $SCWRYPTS_KUBECTL_REDIS_PORT__managed:6379 \
|
||||
redis >/dev/null 2>&1
|
||||
|
||||
STATUS 'awaiting redis connection'
|
||||
until REDIS ping 2>/dev/null | grep -qi pong; do sleep 0.5; done
|
||||
}
|
11
plugins/kubectl/meta/get-static-redis-definition
Executable file
11
plugins/kubectl/meta/get-static-redis-definition
Executable file
@ -0,0 +1,11 @@
|
||||
#!/bin/zsh
|
||||
#####################################################################
|
||||
DEPENDENCIES+=()
|
||||
REQUIRED_ENV+=()
|
||||
|
||||
use redis --group kubectl
|
||||
|
||||
CHECK_ENVIRONMENT
|
||||
#####################################################################
|
||||
|
||||
echo $(REDIS --get-static-definition)
|
28
plugins/kubectl/set-context
Executable file
28
plugins/kubectl/set-context
Executable file
@ -0,0 +1,28 @@
|
||||
#!/bin/zsh
|
||||
#####################################################################
|
||||
DEPENDENCIES+=()
|
||||
REQUIRED_ENV+=()
|
||||
|
||||
use kubectl --group kubectl
|
||||
|
||||
CHECK_ENVIRONMENT
|
||||
#####################################################################
|
||||
|
||||
MAIN() {
|
||||
local USAGE="
|
||||
usage: [context]
|
||||
|
||||
args:
|
||||
context the full name of the kubeconfig context to set
|
||||
"
|
||||
local CONTEXT="$1"
|
||||
[ $CONTEXT ] || $(KUBECTL__SELECT_CONTEXT)
|
||||
[ $CONTEXT ] || ERROR 'must provide or select a valid kube context'
|
||||
|
||||
CHECK_ERRORS
|
||||
|
||||
KUBECTL__SET_CONTEXT $CONTEXT
|
||||
}
|
||||
|
||||
#####################################################################
|
||||
MAIN $@
|
28
plugins/kubectl/set-namespace
Executable file
28
plugins/kubectl/set-namespace
Executable file
@ -0,0 +1,28 @@
|
||||
#!/bin/zsh
|
||||
#####################################################################
|
||||
DEPENDENCIES+=()
|
||||
REQUIRED_ENV+=()
|
||||
|
||||
use kubectl --group kubectl
|
||||
|
||||
CHECK_ENVIRONMENT
|
||||
#####################################################################
|
||||
|
||||
MAIN() {
|
||||
local USAGE="
|
||||
usage: [namespace]
|
||||
|
||||
args:
|
||||
namespace the full name of the namespace to set
|
||||
"
|
||||
local NAMESPACE="$1"
|
||||
[ $NAMESPACE ] || $(KUBECTL__SELECT_NAMESPACE)
|
||||
[ $NAMESPACE ] || ERROR 'must provide or select a valid namespace'
|
||||
|
||||
CHECK_ERRORS
|
||||
|
||||
KUBECTL__SET_NAMESPACE $NAMESPACE
|
||||
}
|
||||
|
||||
#####################################################################
|
||||
MAIN $@
|
@ -13,19 +13,14 @@ if __name__ != '__main__':
|
||||
#####################################################################
|
||||
|
||||
def main(args, stream):
|
||||
if args.body is None:
|
||||
if args.content is None:
|
||||
print(f'reading input from {stream.input.name}', file=stderr)
|
||||
args.body = ''.join(stream.readlines()).strip()
|
||||
args.content = ''.join(stream.readlines()).strip()
|
||||
|
||||
if len(args.body) == 0:
|
||||
args.body = 'PING'
|
||||
if len(args.content) == 0:
|
||||
args.content = 'PING'
|
||||
|
||||
response = discord.send_message(
|
||||
content = args.body,
|
||||
channel_id = args.channel_id,
|
||||
webhook = args.webhook,
|
||||
avatar_url = args.avatar_url,
|
||||
)
|
||||
response = discord.send_message(**vars(args))
|
||||
|
||||
stream.writeline(dumps({
|
||||
**(response.json() if response.text != '' else {'message': 'OK'}),
|
||||
@ -38,23 +33,28 @@ execute(main,
|
||||
description = 'post a message to the indicated discord channel',
|
||||
parse_args = [
|
||||
( ['-b', '--body'], {
|
||||
'dest' : 'body',
|
||||
'dest' : 'content',
|
||||
'help' : 'message body',
|
||||
'required' : False,
|
||||
}),
|
||||
( ['-c', '--channel-id'], {
|
||||
'dest' : 'channel_id',
|
||||
'help' : 'target channel id',
|
||||
'help' : 'override default target channel id',
|
||||
'required' : False,
|
||||
}),
|
||||
( ['-w', '--webhook'], {
|
||||
'dest' : 'webhook',
|
||||
'help' : 'target webhook (takes precedence over -c)',
|
||||
'help' : 'override default target webhook (takes precedence over -c)',
|
||||
'required' : False,
|
||||
}),
|
||||
( ['--avatar-url'], {
|
||||
'dest' : 'avatar_url',
|
||||
'help' : 'replace default avatar_url',
|
||||
'help' : 'override default avatar_url',
|
||||
'required' : False,
|
||||
}),
|
||||
( ['--username'], {
|
||||
'dest' : 'username',
|
||||
'help' : 'override default username',
|
||||
'required' : False,
|
||||
}),
|
||||
]
|
||||
|
@ -1,9 +1,9 @@
|
||||
from py.lib.scwrypts import getenv
|
||||
from py.lib.http.discord import request
|
||||
|
||||
def send_message(content, channel_id=None, webhook=None, avatar_url=None, **kwargs):
|
||||
if channel_id is None:
|
||||
channel_id = getenv('DISCORD__DEFAULT_CHANNEL_ID', required=False)
|
||||
def send_message(content, channel_id=None, webhook=None, username=None, avatar_url=None, **kwargs):
|
||||
if username is None:
|
||||
username = getenv('DISCORD__DEFAULT_USERNAME', required=False)
|
||||
|
||||
if avatar_url is None:
|
||||
avatar_url = getenv('DISCORD__DEFAULT_AVATAR_URL', required=False)
|
||||
@ -12,11 +12,25 @@ def send_message(content, channel_id=None, webhook=None, avatar_url=None, **kwar
|
||||
|
||||
if webhook is not None:
|
||||
endpoint = f'webhooks/{webhook}'
|
||||
|
||||
elif channel_id is not None:
|
||||
endpoint = f'channels/{channel_id}/messages'
|
||||
|
||||
elif (webhook := getenv('DISCORD__DEFAULT_WEBHOOK', required=False)) is not None:
|
||||
endpoint = f'webhooks/{webhook}'
|
||||
|
||||
elif (channel_id := getenv('DISCORD__DEFAULT_CHANNEL_ID', required=False)) is not None:
|
||||
endpoint = f'channels/{channel_id}/messages'
|
||||
|
||||
else:
|
||||
raise ValueError('must provide target channel_id or webhook')
|
||||
|
||||
if (header := getenv('DISCORD__CONTENT_HEADER', required=False)) is not None:
|
||||
content = f'{header}{content}'
|
||||
|
||||
if (footer := getenv('DISCORD__CONTENT_FOOTER', required=False)) is not None:
|
||||
content = f'{content}{footer}'
|
||||
|
||||
|
||||
return request(
|
||||
method = 'POST',
|
||||
@ -25,7 +39,7 @@ def send_message(content, channel_id=None, webhook=None, avatar_url=None, **kwar
|
||||
key: value
|
||||
for key, value in {
|
||||
'content': content,
|
||||
'username': 'wrobot',
|
||||
'username': username,
|
||||
'avatar_url': avatar_url,
|
||||
**kwargs,
|
||||
}.items()
|
||||
|
32
run
32
run
@ -85,6 +85,7 @@ __RUN() {
|
||||
--update )
|
||||
cd "$SCWRYPTS__ROOT__scwrypts"
|
||||
git fetch --quiet origin main
|
||||
git fetch --quiet origin main --tags
|
||||
local SYNC_STATUS=$?
|
||||
|
||||
git diff --exit-code origin/main -- . >&2
|
||||
@ -208,15 +209,34 @@ __RUN() {
|
||||
##########################################
|
||||
|
||||
local ENV_REQUIRED=$(__CHECK_ENV_REQUIRED && echo 1 || echo 0)
|
||||
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)"
|
||||
}
|
||||
|
||||
[[ $ENV_REQUIRED -eq 1 ]] && {
|
||||
[ ! $ENV_NAME ] && ENV_NAME=$(SCWRYPTS__SELECT_ENV)
|
||||
local ENV_FILE=$(SCWRYPTS__GET_ENV_FILE "$ENV_NAME")
|
||||
source "$ENV_FILE" || FAIL 5 "missing or invalid environment '$ENV_NAME'"
|
||||
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'"
|
||||
|
||||
for f in $(eval 'echo $SCWRYPTS_STATIC_CONFIG__'$GROUP)
|
||||
do
|
||||
source "$f" || FAIL 5 "invalid static config '$f'"
|
||||
done
|
||||
done
|
||||
|
||||
export ENV_NAME
|
||||
}
|
||||
|
||||
[ $REQUIRED_ENVIRONMENT_REGEX ] && {
|
||||
[[ $ENV_NAME =~ $REQUIRED_ENVIRONMENT_REGEX ]] \
|
||||
|| FAIL 5 "group '$SCWRYPT_GROUP' requires current environment to match '$REQUIRED_ENVIRONMENT_REGEX' (currently $ENV_NAME)"
|
||||
}
|
||||
|
||||
##########################################
|
||||
|
||||
[ ! $SUBSCWRYPT ] \
|
||||
@ -230,7 +250,7 @@ __RUN() {
|
||||
|
||||
##########################################
|
||||
|
||||
local LOGFILE=$(__GET_LOGFILE $SCRIPT)
|
||||
local LOGFILE=$(__GET_LOGFILE)
|
||||
|
||||
local HEADER=$(
|
||||
[ $SUBSCWRYPT ] && return 0
|
||||
@ -303,11 +323,9 @@ __VALIDATE_UPSTREAM_TIMELINE() {
|
||||
}
|
||||
|
||||
__GET_LOGFILE() {
|
||||
local SCRIPT="$1"
|
||||
|
||||
[ $SUBSCWRYPT ] \
|
||||
|| [[ $SCRIPT =~ scwrypts/logs ]] \
|
||||
|| [[ $SCRIPT =~ interactive ]] \
|
||||
|| [[ $SCWRYPT_NAME =~ scwrypts/logs ]] \
|
||||
|| [[ $SCWRYPT_NAME =~ interactive ]] \
|
||||
&& return 0
|
||||
|
||||
echo "$SCWRYPTS_LOG_PATH/$(echo $GROUP/$TYPE/$NAME | sed 's/^\.\///; s/\//\%/g').log"
|
||||
|
@ -12,13 +12,7 @@ CREATE_BACKUP() {
|
||||
local DB_HOST DB_PORT DB_NAME DB_USER DB_PASS
|
||||
RDS__GET_DATABASE_CREDENTIALS $@ || return 1
|
||||
|
||||
PG_DUMP \
|
||||
--host $DB_HOST \
|
||||
--port $DB_PORT \
|
||||
--name $DB_NAME \
|
||||
--user $DB_USER \
|
||||
--pass $DB_PASS \
|
||||
;
|
||||
PG_DUMP
|
||||
}
|
||||
|
||||
#####################################################################
|
||||
|
@ -12,13 +12,7 @@ RDS_INTERACTIVE_LOGIN() {
|
||||
local DB_HOST DB_PORT DB_NAME DB_USER DB_PASS
|
||||
RDS__GET_DATABASE_CREDENTIALS $@ || return 1
|
||||
|
||||
POSTGRES__LOGIN_INTERACTIVE \
|
||||
--host $DB_HOST \
|
||||
--port $DB_PORT \
|
||||
--name $DB_NAME \
|
||||
--user $DB_USER \
|
||||
--pass $DB_PASS \
|
||||
;
|
||||
POSTGRES__LOGIN_INTERACTIVE
|
||||
}
|
||||
|
||||
|
||||
|
@ -12,13 +12,7 @@ LOAD_BACKUP() {
|
||||
local DB_HOST DB_PORT DB_NAME DB_USER DB_PASS
|
||||
RDS__GET_DATABASE_CREDENTIALS $@ || return 1
|
||||
|
||||
PG_RESTORE \
|
||||
--host $DB_HOST \
|
||||
--port $DB_PORT \
|
||||
--name $DB_NAME \
|
||||
--user $DB_USER \
|
||||
--pass $DB_PASS \
|
||||
;
|
||||
PG_RESTORE
|
||||
}
|
||||
|
||||
|
||||
|
@ -4,15 +4,13 @@ DEPENDENCIES+=(
|
||||
aws
|
||||
)
|
||||
|
||||
REQUIRED_ENV+=(
|
||||
AWS_ACCOUNT
|
||||
AWS_PROFILE
|
||||
AWS_REGION
|
||||
)
|
||||
REQUIRED_ENV+=()
|
||||
|
||||
#####################################################################
|
||||
|
||||
AWS() {
|
||||
REQUIRED_ENV=(AWS_REGION AWS_ACCOUNT AWS_PROFILE) CHECK_ENVIRONMENT || return 1
|
||||
|
||||
aws \
|
||||
--profile $AWS_PROFILE \
|
||||
--region $AWS_REGION \
|
||||
|
@ -86,14 +86,9 @@ RDS__GET_DATABASE_CREDENTIALS() {
|
||||
user-input ) _RDS_AUTH__userinput ;;
|
||||
esac
|
||||
|
||||
STATUS
|
||||
STATUS "host : $DB_HOST"
|
||||
STATUS "type : $DB_TYPE"
|
||||
STATUS "port : $DB_PORT"
|
||||
STATUS "database : $DB_NAME"
|
||||
STATUS "username : $DB_USER"
|
||||
[[ $PRINT_PASSWORD -eq 1 ]] && STATUS "password : $DB_PASS"
|
||||
STATUS
|
||||
[[ $PRINT_PASSWORD -eq 1 ]] && INFO "password : $DB_PASS"
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
_RDS_AUTH__iam() {
|
||||
@ -108,10 +103,10 @@ _RDS_AUTH__iam() {
|
||||
_RDS_AUTH__secretsmanager() {
|
||||
local CREDENTIALS=$(_RDS__GET_SECRETSMANAGER_CREDENTIALS)
|
||||
echo $CREDENTIALS | jq -e '.pass' >/dev/null 2>&1 \
|
||||
&& DB_PASS="'$(echo $CREDENTIALS | jq -r '.pass' | sed "s/'/'\"'\"'/g")'"
|
||||
&& DB_PASS="$(echo $CREDENTIALS | jq -r '.pass')"
|
||||
|
||||
echo $CREDENTIALS | jq -e '.password' >/dev/null 2>&1 \
|
||||
&& DB_PASS="'$(echo $CREDENTIALS | jq -r '.password' | sed "s/'/'\"'\"'/g")'"
|
||||
&& DB_PASS="$(echo $CREDENTIALS | jq -r '.password')"
|
||||
|
||||
echo $CREDENTIALS | jq -e '.user' >/dev/null 2>&1 \
|
||||
&& DB_USER=$(echo $CREDENTIALS | jq -r '.user')
|
||||
|
@ -2,11 +2,6 @@ export SCWRYPTS_ROOT__scwrypts="$SCWRYPTS_ROOT"
|
||||
export SCWRYPTS_LIBRARY_ROOT__scwrypts="$SCWRYPTS_ROOT/zsh/lib"
|
||||
export SCWRYPTS_COLOR__scwrypts='\033[0;32m'
|
||||
|
||||
export SCWRYPTS_ENV_PATH__scwrypts="$SCWRYPTS_CONFIG_PATH/scwrypts/env"
|
||||
[ ! -d "$SCWRYPTS_ENV_PATH__scwrypts" ] && mkdir -p "$SCWRYPTS_ENV_PATH__scwrypts"
|
||||
|
||||
export SCWRYPTS_ENV_TEMPLATE__scwrypts="$SCWRYPTS_ROOT__scwrypts/.env.template"
|
||||
export SCWRYPTS_ENV_TEMPLATE_DESCRIPTIONS__scwrypts="$SCWRYPTS_ROOT__scwrypts/.env.template.descriptions"
|
||||
|
||||
export SCWRYPTS_VIRTUALENV_PATH__scwrypts="$SCWRYPTS_DATA_PATH/virtualenv"
|
||||
[ ! -d "$SCWRYPTS_VIRTUALENV_PATH__scwrypts" ] && mkdir -p "$SCWRYPTS_VIRTUALENV_PATH__scwrypts"
|
||||
|
Binary file not shown.
@ -38,5 +38,11 @@ SCWRYPTS_GROUPS=($(echo $SCWRYPTS_GROUPS | sed 's/\s\+/\n/g' | sort -u))
|
||||
source "$SCWRYPTS_ROOT/zsh/lib/config.group.zsh" \
|
||||
|| FAIL 69 'failed to set up scwrypts group; aborting'
|
||||
|
||||
#####################################################################
|
||||
|
||||
[[ $SCWRYPTS_PLUGIN_ENABLED__kubectl -eq 1 ]] && {
|
||||
source "$SCWRYPTS_ROOT/plugins/kubectl/kubectl.scwrypts.zsh"
|
||||
}
|
||||
|
||||
#####################################################################
|
||||
__SCWRYPT=1 # arbitrary; indicates currently inside a scwrypt
|
||||
|
@ -4,7 +4,6 @@ DEPENDENCIES+=(
|
||||
pg_dump
|
||||
pg_restore
|
||||
psql
|
||||
pgcli
|
||||
)
|
||||
|
||||
REQUIRED_ENV+=()
|
||||
@ -12,22 +11,22 @@ REQUIRED_ENV+=()
|
||||
#####################################################################
|
||||
|
||||
PSQL() {
|
||||
[[ ${#ARGS[@]} -eq 0 ]] && POSTGRES__SET_LOGIN_ARGS $@
|
||||
|
||||
eval PGPASSWORD=$_PASS psql ${_ARGS[@]}
|
||||
POSTGRES__SET_LOGIN_ARGS $@
|
||||
eval PGPASSWORD=$(printf '%q ' "$DB_PASS") psql ${PSQL_ARGS[@]}
|
||||
}
|
||||
|
||||
#####################################################################
|
||||
|
||||
PG_DUMP() {
|
||||
local _HOST _NAME _PORT _USER _FILE
|
||||
local DATA_DIR _PASS _ARGS=()
|
||||
local DATA_DIR
|
||||
POSTGRES__SET_LOGIN_ARGS --verbose $@
|
||||
|
||||
local OUTPUT_FILE="$DATA_DIR/backup.$(date '+%Y-%m-%d.%H-%M')"
|
||||
|
||||
|
||||
|
||||
STATUS "
|
||||
making backup of : $_USER@$_HOST:$_PORT/$_NAME
|
||||
making backup of : $DB_USER@$DB_HOST:$DB_PORT/$DB_NAME
|
||||
|
||||
(compressed) : '$OUTPUT_FILE.dump'
|
||||
(safe-raw) : '$OUTPUT_FILE.sql'
|
||||
@ -36,23 +35,33 @@ PG_DUMP() {
|
||||
|
||||
: \
|
||||
&& STATUS "creating compressed backup..." \
|
||||
&& eval PGPASSWORD=$_PASS pg_dump ${_ARGS[@]} --format custom --file "$OUTPUT_FILE.dump" \
|
||||
&& eval PGPASSWORD=$(printf '%q ' "$DB_PASS") psql ${PSQL_ARGS[@]} \
|
||||
--format custom \
|
||||
--file "$OUTPUT_FILE.dump" \
|
||||
--verbose \
|
||||
&& SUCCESS "completed compressed backup" \
|
||||
&& STATUS "creating raw backup..." \
|
||||
&& eval PGPASSWORD=$_PASS pg_dump ${_ARGS[@]} > "$OUTPUT_FILE.raw.sql" \
|
||||
&& pg_restore -f "$OUTPUT_FILE.raw.sql" "$OUTPUT_FILE.dump" \
|
||||
&& SUCCESS "completed raw backup" \
|
||||
&& STATUS "creating single-transaction raw backup..." \
|
||||
&& { echo "BEGIN;"; cat "$OUTPUT_FILE.raw.sql"; echo "END;" } > "$OUTPUT_FILE.sql" \
|
||||
&& { echo "BEGIN;\n"; cat "$OUTPUT_FILE.raw.sql"; echo "\nEND;" } > "$OUTPUT_FILE.sql" \
|
||||
&& SUCCESS "completed single-transaction raw backup" \
|
||||
|| { ERROR "error creating backup for '$_HOST/$_NAME' (see above)"; return 1; }
|
||||
|| { ERROR "error creating backup for '$DB_HOST/$DB_NAME' (see above)"; return 1; }
|
||||
|
||||
SUCCESS "
|
||||
completed backup : $DB_USER@$DB_HOST:$DB_PORT/$DB_NAME
|
||||
|
||||
(compressed) : '$OUTPUT_FILE.dump'
|
||||
(safe-raw) : '$OUTPUT_FILE.sql'
|
||||
(raw) : '$OUTPUT_FILE.raw.sql'
|
||||
"
|
||||
}
|
||||
|
||||
#####################################################################
|
||||
|
||||
PG_RESTORE() {
|
||||
local _HOST _NAME _PORT _USER
|
||||
local _PASS _ARGS=()
|
||||
local _FILE
|
||||
local _ARGS=()
|
||||
local FILE
|
||||
POSTGRES__SET_LOGIN_ARGS $@
|
||||
|
||||
local INPUT_FILE=$(find "$DATA_DIR"/backup.* -type f | FZF 'select database file to restore')
|
||||
@ -72,7 +81,7 @@ PG_RESTORE() {
|
||||
[[ $INPUT_FILE =~ \\.dump$ ]] && RAW=0
|
||||
|
||||
STATUS "
|
||||
loading backup for : $_USER@$_HOST:$_PORT/$_NAME
|
||||
loading backup for : $DB_USER@$DB_HOST:$DB_PORT/$DB_NAME
|
||||
|
||||
file : '$INPUT_FILE'
|
||||
"
|
||||
@ -92,7 +101,7 @@ PG_RESTORE() {
|
||||
}
|
||||
|
||||
[[ $RAW -eq 0 ]] && {
|
||||
PGPASSWORD="$_PASS" pg_restore ${_ARGS[@]} \
|
||||
eval PGPASSWORD=$(printf '%q ' "$DB_PASS") pg_restore ${PSQL_ARGS[@]} \
|
||||
--verbose \
|
||||
--format custom \
|
||||
--single-transaction \
|
||||
@ -101,8 +110,8 @@ PG_RESTORE() {
|
||||
}
|
||||
|
||||
[[ $EXIT_CODE -eq 0 ]] \
|
||||
&& SUCCESS "finished restoring backup for '$_HOST/$_NAME'" \
|
||||
|| ERROR "error restoring backup for '$_HOST/$_NAME' (see above)" \
|
||||
&& SUCCESS "finished restoring backup for '$DB_HOST/$DB_NAME'" \
|
||||
|| ERROR "error restoring backup for '$DB_HOST/$DB_NAME' (see above)" \
|
||||
;
|
||||
|
||||
return $EXIT_CODE
|
||||
@ -111,48 +120,70 @@ PG_RESTORE() {
|
||||
#####################################################################
|
||||
|
||||
POSTGRES__LOGIN_INTERACTIVE() {
|
||||
local _PASS _ARGS=()
|
||||
DEPENDENCIES=(pgcli) CHECK_ENVIRONMENT --optional \
|
||||
&& COMMAND=pgcli || COMMAND=psql
|
||||
|
||||
[[ $COMMAND =~ psql ]] && WARNING "using 'psql' instead"
|
||||
|
||||
POSTGRES__SET_LOGIN_ARGS $@
|
||||
|
||||
STATUS "performing login : $_USER@$_HOST:$_PORT/$_NAME"
|
||||
STATUS "working directory : $DATA_DIR"
|
||||
STATUS "
|
||||
performing login : $DB_USER@$DB_HOST:$DB_PORT/$DB_NAME
|
||||
working directory : $DATA_DIR
|
||||
"
|
||||
|
||||
eval PGPASSWORD=$_PASS pgcli ${_ARGS[@]}
|
||||
eval PGPASSWORD=$(printf '%q ' "$DB_PASS") $COMMAND ${PSQL_ARGS[@]}
|
||||
}
|
||||
|
||||
#####################################################################
|
||||
|
||||
POSTGRES__SET_LOGIN_ARGS() {
|
||||
# allow for manual override with PSQL_ARGS
|
||||
[[ ${#PSQL_ARGS[@]} -gt 0 ]] && return 0
|
||||
|
||||
local DATA_DIR_PREFIX
|
||||
|
||||
while [[ $# -gt 0 ]]
|
||||
do
|
||||
case $1 in
|
||||
--host ) _ARGS+=(-h $2); _HOST="$2"; shift 1 ;;
|
||||
--name ) _ARGS+=(-d $2); _NAME="$2"; shift 1 ;;
|
||||
--port ) _ARGS+=(-p $2); _PORT="$2"; shift 1 ;;
|
||||
--user ) _ARGS+=(-U $2); _USER="$2"; shift 1 ;;
|
||||
-h | --host ) DB_HOST="$2"; shift 1 ;;
|
||||
-p | --port ) DB_PORT="$2"; shift 1 ;;
|
||||
-d | --name ) DB_NAME="$2"; shift 1 ;;
|
||||
-U | --user ) DB_USER="$2"; shift 1 ;;
|
||||
-P | --pass ) DB_PASS="$2"; shift 1 ;;
|
||||
|
||||
--pass ) _PASS="$2"; shift 1 ;;
|
||||
--file ) PSQL_FILE="$2"; shift 1 ;;
|
||||
|
||||
--file ) _FILE="$2"; shift 1 ;;
|
||||
--data-dir-prefix ) DATA_DIR_PREFIX="$2"; shift 1 ;;
|
||||
|
||||
* ) _ARGS+=($1) ;;
|
||||
* ) PSQL_ARGS+=($1) ;;
|
||||
esac
|
||||
shift 1
|
||||
done
|
||||
|
||||
[ $_FILE ] && [ ! -f "$_FILE" ] && {
|
||||
ERROR "no such file '$_FILE'"
|
||||
exit 1
|
||||
[ $PSQL_FILE ] && [ ! -f "$PSQL_FILE" ] \
|
||||
&& ERROR "no such file available:\n'$PSQL_FILE'"
|
||||
|
||||
CHECK_ERRORS
|
||||
|
||||
##########################################
|
||||
|
||||
[ $DATA_DIR_PREFIX ] && {
|
||||
DATA_DIR="$SCWRYPTS_DATA_PATH/$DATA_DIR_PREFIX"
|
||||
} || {
|
||||
[ $DB_HOST ] && [ $DB_NAME ] \
|
||||
&& DATA_DIR="$SCWRYPTS_DATA_PATH/db/$DB_HOST/$DB_NAME" \
|
||||
|| DATA_DIR="$EXECUTION_DIR/temp-db" \
|
||||
;
|
||||
}
|
||||
|
||||
[ $_HOST ] && [ $_NAME ] \
|
||||
&& DATA_DIR="$SCWRYPTS_DATA_PATH/db/$_HOST/$_NAME" \
|
||||
|| DATA_DIR="$EXECUTION_DIR/temp-db" \
|
||||
;
|
||||
|
||||
[ ! -d "$DATA_DIR" ] && mkdir -p "$DATA_DIR"
|
||||
mkdir -p "$DATA_DIR"
|
||||
cd "$DATA_DIR"
|
||||
|
||||
return 0
|
||||
}
|
||||
[ $DB_HOST ] || DB_HOST=127.0.0.1
|
||||
[ $DB_PORT ] || DB_PORT=5432
|
||||
[ $DB_NAME ] || DB_NAME=postgres
|
||||
[ $DB_USER ] || DB_USER=postgres
|
||||
|
||||
PSQL_ARGS+=(-h $DB_HOST -p $DB_PORT -d $DB_NAME -U $DB_USER)
|
||||
}
|
||||
|
@ -118,7 +118,16 @@ use() {
|
||||
}
|
||||
|
||||
GET_SCWRYPTS_LIBRARY_ROOT() {
|
||||
eval echo '$SCWRYPTS_LIBRARY_ROOT__'$SCWRYPTS_LIBRARY_GROUP
|
||||
local ROOT
|
||||
|
||||
ROOT=$(eval echo '$SCWRYPTS_LIBRARY_ROOT__'$SCWRYPTS_LIBRARY_GROUP)
|
||||
[ $ROOT ] && echo $ROOT && return 0
|
||||
|
||||
[[ $(eval echo '$SCWRYPTS_TYPE__'$SCWRYPTS_LIBRARY_GROUP) =~ zsh ]] \
|
||||
&& ROOT=$(eval echo '$SCWRYPTS_ROOT__'$SCWRYPTS_LIBRARY_GROUP/lib) \
|
||||
|| ROOT=$(eval echo '$SCWRYPTS_ROOT__'$SCWRYPTS_LIBRARY_GROUP/zsh/lib) \
|
||||
;
|
||||
[ $ROOT ] && echo $ROOT && return 0
|
||||
}
|
||||
|
||||
IS_LOADED() {
|
||||
|
@ -15,20 +15,47 @@ SCWRYPTS__SELECT_OR_CREATE_ENV() {
|
||||
SCWRYPTS__GET_ENV_NAMES | FZF_TAIL 'select / create an environment'
|
||||
}
|
||||
|
||||
SCWRYPTS__GET_ENV_FILE() {
|
||||
SCWRYPTS__GET_ENV_FILES() {
|
||||
local NAME="$1"
|
||||
|
||||
echo "$SCWRYPTS_ENV_PATH/$NAME"
|
||||
local FILENAMES=$(
|
||||
for GROUP in ${SCWRYPTS_GROUPS[@]}
|
||||
do
|
||||
echo "$SCWRYPTS_ENV_PATH/$GROUP/$NAME"
|
||||
done
|
||||
)
|
||||
|
||||
echo $FILENAMES | grep 'environments/scwrypts/'
|
||||
echo $FILENAMES | grep -v 'environments/scwrypts/' | sort
|
||||
|
||||
SCWRYPTS__GET_ENV_NAMES | grep -q $NAME \
|
||||
|| { ERROR "no environment '$NAME' exists"; return 1; }
|
||||
}
|
||||
|
||||
SCWRYPTS__GET_ENV_FILE() {
|
||||
local NAME="$1"
|
||||
local GROUP="$2"
|
||||
|
||||
[ ! $GROUP ] && { ERROR 'must provide group'; return 1; }
|
||||
|
||||
echo "$SCWRYPTS_ENV_PATH/$GROUP/$NAME"
|
||||
|
||||
SCWRYPTS__GET_ENV_NAMES | grep -q $NAME \
|
||||
|| { ERROR "no environment '$NAME' exists"; return 1; }
|
||||
|
||||
[ -f "$SCWRYPTS_ENV_PATH/$GROUP/$NAME" ] || {
|
||||
mkdir -p "$SCWRYPTS_ENV_PATH/$GROUP"
|
||||
touch "$SCWRYPTS_ENV_PATH/$GROUP/$NAME"
|
||||
}
|
||||
[ -f "$SCWRYPTS_ENV_PATH/$GROUP/$NAME" ] \
|
||||
|| { ERROR "missing environment file for '$GROUP/$NAME'"; return 2; }
|
||||
}
|
||||
|
||||
SCWRYPTS__GET_ENV_TEMPLATE_FILES() {
|
||||
local GROUP
|
||||
for GROUP in ${SCWRYPTS_GROUPS[@]}
|
||||
do
|
||||
eval echo '$SCWRYPTS_ENV_TEMPLATE__'$GROUP
|
||||
eval echo '$SCWRYPTS_ROOT__'$GROUP/.config/env.template
|
||||
done
|
||||
}
|
||||
|
||||
@ -37,7 +64,11 @@ SCWRYPTS__GET_ENV_NAMES() {
|
||||
ERROR 'environment initialization error'
|
||||
return 1
|
||||
}
|
||||
ls "$SCWRYPTS_ENV_PATH" | sort -r
|
||||
[ $REQUIRED_ENVIRONMENT_REGEX ] && {
|
||||
ls "$SCWRYPTS_ENV_PATH/scwrypts" | grep "$REQUIRED_ENVIRONMENT_REGEX" | sort -r
|
||||
} || {
|
||||
ls "$SCWRYPTS_ENV_PATH/scwrypts" | sort -r
|
||||
}
|
||||
}
|
||||
|
||||
SCWRYPTS__INIT_ENVIRONMENTS() {
|
||||
@ -49,7 +80,11 @@ SCWRYPTS__INIT_ENVIRONMENTS() {
|
||||
local BASIC_ENV
|
||||
for BASIC_ENV in local dev prod
|
||||
do
|
||||
GENERATE_TEMPLATE > "$SCWRYPTS_ENV_PATH/$BASIC_ENV"
|
||||
for GROUP in ${SCWRYPTS_GROUPS[@]}
|
||||
do
|
||||
mkdir -p "$SCWRYPTS_ENV_PATH/$GROUP"
|
||||
GENERATE_TEMPLATE > "$SCWRYPTS_ENV_PATH/$GROUP/$BASIC_ENV"
|
||||
done
|
||||
done
|
||||
}
|
||||
|
||||
@ -58,30 +93,28 @@ SCWRYPTS__INIT_ENVIRONMENTS() {
|
||||
_SED() { sed --follow-symlinks $@; }
|
||||
|
||||
GENERATE_TEMPLATE() {
|
||||
echo "#!/bin/zsh"
|
||||
echo '#####################################################################'
|
||||
echo "### scwrypts runtime configuration ##################################"
|
||||
echo '#####################################################################'
|
||||
local FILE GROUP CONTENT
|
||||
local VARIABLE DESCRIPTION
|
||||
for GROUP in ${SCWRYPTS_GROUPS[@]}
|
||||
do
|
||||
FILE=$(eval echo '$SCWRYPTS_ENV_TEMPLATE__'$GROUP)
|
||||
[ ! $GROUP ] && { ERROR 'must provide GROUP'; return 1; }
|
||||
DIVIDER='#####################################################################'
|
||||
HEADER='### scwrypts runtime configuration '
|
||||
[[ GROUP =~ ^scwrypts$ ]] || HEADER="${HEADER}(group '$GROUP') "
|
||||
printf "#!/bin/zsh\n$DIVIDER\n$HEADER%s\n$DIVIDER\n" "${DIVIDER:${#$(echo "$HEADER")}}"
|
||||
|
||||
CONTENT=$(GET_VARIABLE_NAMES "$FILE" | sed 's/^/export /; s/$/=/')
|
||||
local FILE CONTENT
|
||||
local VARIABLE DESCRIPTION
|
||||
FILE=$(eval echo '$SCWRYPTS_ROOT__'$GROUP/.config/env.template)
|
||||
|
||||
while read DESCRIPTION_LINE
|
||||
do
|
||||
VARIABLE=$(echo $DESCRIPTION_LINE | sed 's/ \+| .*$//')
|
||||
DESCRIPTION=$(echo $DESCRIPTION_LINE | sed 's/^.* | //')
|
||||
[ ! $DESCRIPTION ] && continue
|
||||
CONTENT=$(GET_VARIABLE_NAMES "$FILE" | sed 's/^/export /; s/$/=/')
|
||||
|
||||
CONTENT=$(echo "$CONTENT" | sed "/^export $VARIABLE=/i #" | sed "/^export $VARIABLE=/i # $DESCRIPTION")
|
||||
done < <(_SED -n '/^[^ ]\+ \+| /p' "$FILE.descriptions")
|
||||
while read DESCRIPTION_LINE
|
||||
do
|
||||
VARIABLE=$(echo $DESCRIPTION_LINE | sed 's/ \+| .*$//')
|
||||
DESCRIPTION=$(echo $DESCRIPTION_LINE | sed 's/^.* | //')
|
||||
[ ! $DESCRIPTION ] && continue
|
||||
|
||||
echo "$CONTENT" | sed 's/^#$//'
|
||||
echo '\n#####################################################################'
|
||||
done
|
||||
CONTENT=$(echo "$CONTENT" | sed "/^export $VARIABLE=/i #" | sed "/^export $VARIABLE=/i # $DESCRIPTION")
|
||||
done < <(_SED -n '/^[^ ]\+ \+| /p' "$FILE.descriptions")
|
||||
|
||||
echo "$CONTENT" | sed 's/^#$//'
|
||||
}
|
||||
|
||||
GET_VARIABLE_NAMES() {
|
||||
@ -91,4 +124,3 @@ GET_VARIABLE_NAMES() {
|
||||
| grep -v '__[a-z]\+$' \
|
||||
;
|
||||
}
|
||||
|
||||
|
@ -16,14 +16,18 @@ SCWRYPTS__GET_AVAILABLE_SCWRYPTS() {
|
||||
do
|
||||
GROUP_PATH=$(eval echo '$SCWRYPTS_ROOT__'$GROUP)
|
||||
GROUP_COLOR=$(eval echo '$SCWRYPTS_COLOR__'$GROUP)
|
||||
{
|
||||
cd "$GROUP_PATH"
|
||||
find . -mindepth 2 -type f -executable \
|
||||
| grep -v '\.git' \
|
||||
| grep -v 'node_modules' \
|
||||
| sed "s/^\\.\\///; s/\\.[^.]*$//" \
|
||||
| sed "s|\\([^/]*\\)/\(.*\)$|$(printf $__COLOR_RESET)\\2^$(printf $TYPE_COLOR)\\1^$(printf $GROUP_COLOR)$GROUP$(printf $__COLOR_RESET)|" \
|
||||
|
||||
GROUP_TYPE=$(eval echo '$SCWRYPTS_TYPE__'$GROUP)
|
||||
[ $GROUP_TYPE ] && MINDEPTH=1 && GROUP_TYPE="$GROUP_TYPE\\/" || MINDEPTH=2
|
||||
|
||||
command -v SCWRYPTS__LIST_AVAILABLE_SCWRYPTS__$GROUP >/dev/null 2>&1 \
|
||||
&& LOOKUP=SCWRYPTS__LIST_AVAILABLE_SCWRYPTS__$GROUP \
|
||||
|| LOOKUP=SCWRYPTS__LIST_AVAILABLE_SCWRYPTS__scwrypts \
|
||||
;
|
||||
|
||||
{
|
||||
$LOOKUP \
|
||||
| sed "s|\\([^/]*\\)/\(.*\)$|$(printf $__COLOR_RESET)\\2^$(printf $TYPE_COLOR)\\1^$(printf $GROUP_COLOR)$GROUP$(printf $__COLOR_RESET)|" \
|
||||
} &
|
||||
LOOKUP_PIDS+=($!)
|
||||
done
|
||||
@ -42,54 +46,63 @@ SCWRYPTS__SEPARATE_SCWRYPT_SELECTION() {
|
||||
done
|
||||
}
|
||||
|
||||
SCWRYPTS__LIST_AVAILABLE_SCWRYPTS__scwrypts() {
|
||||
# implementation should output lines of the following format:
|
||||
# "${SCWRYPT_TYPE}/${SCWRYPT_NAME}"
|
||||
cd "$GROUP_PATH"
|
||||
find . -mindepth $MINDEPTH -type f -executable \
|
||||
| grep -v '\.git' \
|
||||
| grep -v 'node_modules' \
|
||||
| sed "s/^\\.\\///; s/\\.[^.]*$//; s/^/$GROUP_TYPE/" \
|
||||
| grep -v '^plugins/' \
|
||||
;
|
||||
}
|
||||
|
||||
SCWRYPTS__GET_RUNSTRING() {
|
||||
# accepts a selected line from SCWRYPTS__GET_AVAILABLE_SCWRYPTS
|
||||
local NAME="$1"
|
||||
local TYPE="$2"
|
||||
local GROUP="$3"
|
||||
local GROUP_PATH=$(eval echo '$SCWRYPTS_ROOT__'$GROUP)
|
||||
local GROUP_PATH=$(eval echo '$SCWRYPTS_ROOT__'$SCWRYPT_GROUP)
|
||||
local RUNSTRING
|
||||
|
||||
[ $NAME ] && [ $TYPE ] && [ $GROUP ] || {
|
||||
[ $SCWRYPT_NAME ] && [ $SCWRYPT_TYPE ] && [ $SCWRYPT_GROUP ] || {
|
||||
ERROR 'missing required information to get runstring'
|
||||
return 1
|
||||
}
|
||||
|
||||
[ $ENV_REQUIRED ] && [[ $ENV_REQUIRED -eq 1 ]] && [ ! $ENV_NAME ] && {
|
||||
ERROR 'missing required information to get runstring'
|
||||
return 1
|
||||
}
|
||||
|
||||
typeset -f SCWRYPTS__GET_RUNSTRING__${GROUP}__${TYPE} >/dev/null 2>&1 && {
|
||||
RUNSTRING=$(SCWRYPTS__GET_RUNSTRING__${GROUP}__${TYPE})
|
||||
[ ! $RUNSTRING ] && typeset -f SCWRYPTS__GET_RUNSTRING__${SCWRYPT_GROUP}__${SCWRYPT_TYPE} >/dev/null 2>&1 && {
|
||||
RUNSTRING=$(SCWRYPTS__GET_RUNSTRING__${SCWRYPT_GROUP}__${SCWRYPT_TYPE})
|
||||
[ ! $RUNSTRING ] && {
|
||||
ERROR "SCWRYPTS__GET_RUNSTRING__${GROUP}__${TYPE} error"
|
||||
ERROR "SCWRYPTS__GET_RUNSTRING__${SCWRYPT_GROUP}__${SCWRYPT_TYPE} error"
|
||||
return 2
|
||||
}
|
||||
}
|
||||
|
||||
typeset -f SCWRYPTS__GET_RUNSTRING__${TYPE} >/dev/null 2>&1 && {
|
||||
RUNSTRING=$(SCWRYPTS__GET_RUNSTRING__${TYPE})
|
||||
[ ! $RUNSTRING ] && typeset -f SCWRYPTS__GET_RUNSTRING__${SCWRYPT_TYPE} >/dev/null 2>&1 && {
|
||||
RUNSTRING=$(SCWRYPTS__GET_RUNSTRING__${SCWRYPT_TYPE})
|
||||
[ ! $RUNSTRING ] && {
|
||||
ERROR "SCWRYPTS__GET_RUNSTRING__${TYPE} error"
|
||||
ERROR "SCWRYPTS__GET_RUNSTRING__${SCWRYPT_TYPE} error"
|
||||
return 3
|
||||
}
|
||||
}
|
||||
|
||||
[ ! $RUNSTRING ] && {
|
||||
ERROR "type ${TYPE} (group ${GROUP}) has no supported runstring generator"
|
||||
ERROR "type ${SCWRYPT_TYPE} (group ${SCWRYPT_GROUP}) has no supported runstring generator"
|
||||
return 4
|
||||
}
|
||||
|
||||
RUNSTRING="SCWRYPTS_ENV=$ENV_NAME; $RUNSTRING"
|
||||
RUNSTRING="source $SCWRYPTS_ROOT/zsh/lib/import.driver.zsh; $RUNSTRING"
|
||||
|
||||
local _VIRTUALENV=$(eval echo '$SCWRYPTS_VIRTUALENV_PATH__'$GROUP'/$TYPE/bin/activate')
|
||||
local _VIRTUALENV=$(eval echo '$SCWRYPTS_VIRTUALENV_PATH__'$SCWRYPT_GROUP'/$SCWRYPT_TYPE/bin/activate')
|
||||
[ -f $_VIRTUALENV ] && RUNSTRING="source $_VIRTUALENV; $RUNSTRING"
|
||||
|
||||
local G SCWRYPTSENV
|
||||
for G in ${SCWRYPTS__GROUPS[@]}
|
||||
do
|
||||
SCWRYPTSENV=$(eval echo '$SCWRYPTS_ENV_PATH__'$GROUP'/$ENV_NAME')
|
||||
SCWRYPTSENV="$SCWRYPTS_ENV_PATH/$G/$ENV_NAME"
|
||||
[ -f $SCWRYPTSENV ] && RUNSTRING="source $SCWRYPTSENV; $RUNSTRING"
|
||||
done
|
||||
|
||||
@ -99,7 +112,12 @@ SCWRYPTS__GET_RUNSTRING() {
|
||||
SCWRYPTS__GET_RUNSTRING__zsh() {
|
||||
__CHECK_DEPENDENCY zsh || return 1
|
||||
|
||||
echo "source $GROUP_PATH/$TYPE/$NAME"
|
||||
[ $(eval echo '$SCWRYPTS_TYPE__'$SCWRYPT_GROUP) ] \
|
||||
&& echo "source $GROUP_PATH/$SCWRYPT_NAME" \
|
||||
|| echo "source $GROUP_PATH/$SCWRYPT_TYPE/$SCWRYPT_NAME" \
|
||||
;
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
SCWRYPTS__GET_RUNSTRING__py() {
|
||||
@ -110,11 +128,11 @@ SCWRYPTS__GET_RUNSTRING__py() {
|
||||
WARNING 'compatibility may vary'
|
||||
}
|
||||
|
||||
echo "cd $GROUP_PATH; python -m $(echo $TYPE/$NAME | sed 's/\//./g; s/\.py$//; s/\.\.//')"
|
||||
echo "cd $GROUP_PATH; python -m $(echo $SCWRYPT_TYPE/$SCWRYPT_NAME | sed 's/\//./g; s/\.py$//; s/\.\.//')"
|
||||
}
|
||||
|
||||
SCWRYPTS__GET_RUNSTRING__zx() {
|
||||
__CHECK_DEPENDENCY zx || return 1
|
||||
|
||||
echo "FORCE_COLOR=3; cd $GROUP_PATH; ./$TYPE/$NAME.js"
|
||||
echo "export FORCE_COLOR=3; cd $GROUP_PATH; ./$SCWRYPT_TYPE/$SCWRYPT_NAME.js"
|
||||
}
|
||||
|
@ -37,7 +37,11 @@ UPDATE_VIRTUALENV() {
|
||||
|
||||
local VIRTUALENV_PATH=$(GET_VIRTUALENV_PATH $GROUP $TYPE)
|
||||
|
||||
[ ! -d $VIRTUALENV_PATH ] && CREATE_VIRTUALENV__${GROUP}__${TYPE} $VIRTUALENV_PATH
|
||||
[ ! -d $VIRTUALENV_PATH ] && {
|
||||
which CREATE_VIRTUALENV__${GROUP}__${TYPE} >/dev/null 2>&1 \
|
||||
&& CREATE_VIRTUALENV__${GROUP}__${TYPE} $VIRTUALENV_PATH \
|
||||
|| return 0
|
||||
}
|
||||
|
||||
STATUS "updating $TYPE virtual environment"
|
||||
|
||||
@ -49,7 +53,7 @@ UPDATE_VIRTUALENV() {
|
||||
cd $SCWRYPTS_ROOT
|
||||
local UPDATE_CODE=0
|
||||
case $TYPE in
|
||||
py ) cd py; pip install -r requirements.txt; UPDATE_CODE=$? ;;
|
||||
py ) cd py; pip install --no-cache-dir -r requirements.txt; UPDATE_CODE=$? ;;
|
||||
zx ) cd zx; npm install ;;
|
||||
esac
|
||||
UPDATE_CODE=$?
|
||||
@ -83,7 +87,11 @@ DELETE_VIRTUALENV() {
|
||||
GET_VIRTUALENV_PATH() {
|
||||
local GROUP="$1"
|
||||
local TYPE="$2"
|
||||
eval echo '$SCWRYPTS_VIRTUALENV_PATH__'$GROUP/$TYPE
|
||||
|
||||
local ENV_PATH="$(eval echo '$SCWRYPTS_VIRTUALENV_PATH__'$GROUP 2>/dev/null)"
|
||||
[ ! $ENV_PATH ] && ENV_PATH="$SCWRYPTS_VIRTUALENV_PATH__scwrypts"
|
||||
|
||||
echo $ENV_PATH/$TYPE
|
||||
}
|
||||
|
||||
#####################################################################
|
||||
@ -121,7 +129,7 @@ CREATE_VIRTUALENV__scwrypts__zx() {
|
||||
nodeenv $VIRTUALENV_PATH --node=$SCWRYPTS_NODE_VERSION__scwrypts \
|
||||
&& SUCCESS 'node virtualenv created' \
|
||||
|| {
|
||||
ERROR "unable to create '$VIRTUALENV_PATH' with '$SCWRYPTS__NODE_VERSION'"
|
||||
ERROR "unable to create '$VIRTUALENV_PATH' with '$SCWRYPTS_NODE_VERSION__scwrypts'"
|
||||
return 2
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
__CHECK_DEPENDENCIES() {
|
||||
local DEP ERROR=0
|
||||
[ ! $E ] && E=ERROR
|
||||
|
||||
DEPENDENCIES=($(echo $DEPENDENCIES | sed 's/ \+/\n/g' | sort -u))
|
||||
|
||||
@ -13,7 +14,7 @@ __CHECK_DEPENDENCY() {
|
||||
local DEPENDENCY="$1"
|
||||
[ ! $DEPENDENCY ] && return 1
|
||||
command -v $DEPENDENCY >/dev/null 2>&1 || {
|
||||
ERROR "'$1' required but not available on PATH $(__CREDITS $1)"
|
||||
$E "application '$1' "$([[ $OPTIONAL -eq 1 ]] && echo preferred || echo required)" but not available on PATH $(__CREDITS $1)"
|
||||
return 1
|
||||
}
|
||||
}
|
||||
|
@ -32,7 +32,7 @@ __CHECK_ENV_VAR() {
|
||||
[ $DEFAULT_VALUE ] && $NAME="$DEFAULT_VALUE"
|
||||
return 0
|
||||
} || {
|
||||
ERROR "'$NAME' required"
|
||||
ERROR "variable '$NAME' required"
|
||||
return 1
|
||||
}
|
||||
}
|
||||
|
@ -16,7 +16,9 @@ PRINT() {
|
||||
shift 1
|
||||
done
|
||||
|
||||
local STYLED_MESSAGE="${COLOR}$({
|
||||
MESSAGE="$(echo "$MESSAGE" | sed 's/%/%%/g')"
|
||||
|
||||
local STYLED_MESSAGE="$({
|
||||
printf "${COLOR}"
|
||||
while IFS='' read line
|
||||
do
|
||||
@ -26,7 +28,9 @@ PRINT() {
|
||||
|
||||
PREFIX=$(echo $PREFIX | sed 's/./ /g')
|
||||
done <<< $MESSAGE
|
||||
})${__COLOR_RESET}${LAST_LINE_END}"
|
||||
})"
|
||||
STYLED_MESSAGE="${COLOR}$(echo "$STYLED_MESSAGE" | sed 's/%/%%/g')${__COLOR_RESET}${LAST_LINE_END}"
|
||||
|
||||
[[ $STDERR -eq 1 ]] && printf $STYLED_MESSAGE >&2
|
||||
[[ $STDOUT -eq 1 ]] && printf $STYLED_MESSAGE
|
||||
|
||||
@ -95,7 +99,7 @@ Yn() {
|
||||
PROMPT "$@ [Yn]"
|
||||
[ $CI ] && { echo y; return 0; }
|
||||
|
||||
local Yn; READ -k Yn; echo
|
||||
local Yn; READ -k Yn; echo >&2
|
||||
[[ $Yn =~ [nN] ]] && return 1 || return 0
|
||||
}
|
||||
|
||||
@ -103,7 +107,7 @@ yN() {
|
||||
PROMPT "$@ [yN]"
|
||||
[ $CI ] && { echo y; return 0; }
|
||||
|
||||
local yN; READ -k yN; echo
|
||||
local yN; READ -k yN; echo >&2
|
||||
[[ $yN =~ [yY] ]] && return 0 || return 1
|
||||
}
|
||||
|
||||
@ -124,7 +128,15 @@ FZF() {
|
||||
exit 1
|
||||
}
|
||||
|
||||
local SELECTION=$(fzf -i --height=30% --layout=reverse --prompt "$1 : " ${@:2})
|
||||
local FZF_ARGS=()
|
||||
|
||||
FZF_ARGS+=(-i)
|
||||
FZF_ARGS+=(--ansi)
|
||||
FZF_ARGS+=(--bind=ctrl-c:cancel)
|
||||
FZF_ARGS+=(--height=50%)
|
||||
FZF_ARGS+=(--layout=reverse)
|
||||
|
||||
local SELECTION=$(fzf ${FZF_ARGS[@]} --layout=reverse --prompt "$1 : " ${@:2})
|
||||
PROMPT "$1"
|
||||
echo $SELECTION >&2
|
||||
echo $SELECTION
|
||||
|
@ -18,6 +18,12 @@ source ${0:a:h}/environment.zsh
|
||||
#####################################################################
|
||||
|
||||
CHECK_ENVIRONMENT() {
|
||||
local OPTIONAL=0
|
||||
[[ $1 =~ --optional ]] && OPTIONAL=1
|
||||
|
||||
[[ $OPTIONAL -eq 1 ]] \
|
||||
&& E=WARNING || E=ERROR
|
||||
|
||||
local ENVIRONMENT_STATUS=0
|
||||
|
||||
__CHECK_DEPENDENCIES $DEPENDENCIES
|
||||
@ -55,9 +61,9 @@ CHECK_ENVIRONMENT() {
|
||||
|
||||
##########################################
|
||||
|
||||
[[ ENVIRONMENT_STATUS -eq 0 ]] || {
|
||||
[[ ENVIRONMENT_STATUS -ne 0 ]] && [[ $OPTIONAL -eq 0 ]] && {
|
||||
ERROR_MESSAGE=$(echo $ERROR_MESSAGE | sed '1d; s/^/ /')
|
||||
ERROR "environment errors found (see above)\n$ERROR_MESSAGE"
|
||||
$E "environment errors found (see above)\n$ERROR_MESSAGE"
|
||||
}
|
||||
|
||||
[[ $MISSING_ENVIRONMENT_VARIABLES -ne 0 ]] && {
|
||||
@ -67,10 +73,11 @@ CHECK_ENVIRONMENT() {
|
||||
"
|
||||
}
|
||||
|
||||
[[ $ENVIRONMENT_STATUS -eq 0 ]] || {
|
||||
[[ $NO_EXIT -eq 1 ]] && return $ENVIRONMENT_STATUS
|
||||
[[ $ENVIRONMENT_STATUS -ne 0 ]] && [[ $NO_EXIT -ne 1 ]] && [[ $OPTIONAL -eq 0 ]] && {
|
||||
exit $ENVIRONMENT_STATUS
|
||||
}
|
||||
|
||||
return $ENVIRONMENT_STATUS
|
||||
}
|
||||
|
||||
CHECK_ENVIRONMENT
|
||||
|
@ -1,4 +1,4 @@
|
||||
#!/bin/zsh
|
||||
#!/bin/zsh
|
||||
DEPENDENCIES+=()
|
||||
REQUIRED_ENV+=()
|
||||
|
||||
@ -16,18 +16,23 @@ STATUS "selected '$TEMPLATE_ENV_NAME'"
|
||||
PROMPT 'enter new environment name'
|
||||
ENV_NAME=$(echo '' | FZF_HEAD 'new environment')
|
||||
[ ! $ENV_NAME ] && ABORT
|
||||
SCWRYPTS__GET_ENV_NAMES | grep -q $ENV_NAME && FAIL 1 "'$ENV_NAME' already exists"
|
||||
|
||||
TEMPLATE_ENV_FILE=$(SCWRYPTS__GET_ENV_FILE $TEMPLATE_ENV_NAME 2>/dev/null)
|
||||
ENV_FILE=$(SCWRYPTS__GET_ENV_FILE $ENV_NAME)
|
||||
for GROUP in ${SCWRYPTS_GROUPS[@]}
|
||||
do
|
||||
TEMPLATE_ENV_FILE=$(SCWRYPTS__GET_ENV_FILE $TEMPLATE_ENV_NAME $GROUP 2>/dev/null)
|
||||
ENV_FILE=$(SCWRYPTS__GET_ENV_FILE $ENV_NAME $GROUP 2>/dev/null)
|
||||
|
||||
[ -f "$ENV_FILE" ] && FAIL 2 "'$ENV_NAME' already exists"
|
||||
STATUS "creating environment '$ENV_NAME'"
|
||||
cat "$TEMPLATE_ENV_FILE" \
|
||||
| sed 's/ # from.*//' \
|
||||
> "$ENV_FILE" \
|
||||
&& SUCCESS "created '$ENV_FILE'" \
|
||||
|| FAIL 2 "something went wrong creating '$ENV_FILE'"
|
||||
done
|
||||
|
||||
STATUS "creating environment '$ENV_NAME'"
|
||||
cat "$TEMPLATE_ENV_FILE" \
|
||||
| sed 's/ from.*//' \
|
||||
> "$ENV_FILE" \
|
||||
&& SCWRYPTS__RUN --name scwrypts/environment/synchronize --group scwrypts --type zsh -- --no-prompt \
|
||||
&& SUCCESS "created '$ENV_NAME'" \
|
||||
|| FAIL 3 "something went wrong creating '$ENV_NAME'"
|
||||
|
||||
SUCCESS "finished copy environment '$TEMPLATE_ENV_NAME > $ENV_NAME'"
|
||||
STATUS "synchronizing environments"
|
||||
SCWRYPTS__RUN --name scwrypts/environment/synchronize --group scwrypts --type zsh -- --no-prompt \
|
||||
&& SUCCESS "finished copy environment '$TEMPLATE_ENV_NAME > $ENV_NAME'" \
|
||||
|| FAIL 3 'error during synchronization of new environment (see above)' \
|
||||
;
|
||||
|
@ -11,18 +11,26 @@ PROMPT 'choose an environment to delete'
|
||||
ENV_NAME=$(SCWRYPTS__SELECT_ENV)
|
||||
[ ! $ENV_NAME ] && ABORT
|
||||
|
||||
ENV_FILE=$(SCWRYPTS__GET_ENV_FILE $ENV_NAME)
|
||||
ENV_FILES=($(SCWRYPTS__GET_ENV_FILES $ENV_NAME))
|
||||
|
||||
STATUS "preparing to remove '$ENV_NAME'"
|
||||
|
||||
WARNING "
|
||||
the '$ENV_NAME' environment will be removed
|
||||
configured options and stored credentials will be lost forever
|
||||
the '$ENV_NAME' environment will be removed configured options
|
||||
and stored credentials will be lost forever:
|
||||
|
||||
$(echo $ENV_FILES | sed 's| /|\n - /|g; s/^/ - /')
|
||||
"
|
||||
|
||||
yN 'continue?' || ABORT
|
||||
|
||||
STATUS "removing environment"
|
||||
rm "$ENV_FILE" \
|
||||
&& SUCCESS "removed '$ENV_NAME'" \
|
||||
|| FAIL 3 "unable to remove '$ENV_FILE'; is it protected?"
|
||||
for ENV_FILE in ${ENV_FILES[@]}
|
||||
do
|
||||
rm "$ENV_FILE" \
|
||||
&& SUCCESS "removed '$ENV_FILE'" \
|
||||
|| ERROR "unable to remove '$ENV_FILE'; is it protected?" \
|
||||
;
|
||||
done
|
||||
|
||||
CHECK_ERRORS -n || FAIL 2 "some errors ocurred when cleaning up $ENV_NAME"
|
||||
|
@ -16,16 +16,27 @@ CHECK_ENVIRONMENT
|
||||
}
|
||||
[ ! $ENV_NAME ] && ABORT
|
||||
|
||||
ENV_FILE=$(SCWRYPTS__GET_ENV_FILE $ENV_NAME 2>/dev/null)
|
||||
[ ! -f "$ENV_FILE" ] && {
|
||||
STATUS "Creating '$ENV_NAME'..." \
|
||||
&& touch "$ENV_FILE" \
|
||||
&& SCWRYPTS__RUN --name scwrypts/environment/synchronize --group scwrypts --type zsh -- --no-prompt \
|
||||
&& SUCCESS "created '$ENV_NAME'" \
|
||||
|| { ERROR "failed to create '$ENV_FILE'"; exit 1; }
|
||||
}
|
||||
ENV_FILES=($(SCWRYPTS__GET_ENV_FILES $ENV_NAME 2>/dev/null))
|
||||
for ENV_FILE in ${ENV_FILES[@]}
|
||||
do
|
||||
[ ! -f "$ENV_FILE" ] && {
|
||||
STATUS "Creating '$ENV_FILE'..." \
|
||||
&& mkdir -p "$(dirname "$ENV_FILE")" \
|
||||
&& touch "$ENV_FILE" \
|
||||
&& ((CREATED+=1)) \
|
||||
&& SUCCESS "created '$ENV_NAME'" \
|
||||
|| { ERROR "failed to create '$ENV_FILE'"; exit 1; }
|
||||
}
|
||||
|
||||
EDIT $ENV_FILE
|
||||
[ $CREATED ] && [[ $CREATED -gt 0 ]] && {
|
||||
STATUS "detected new environment files; performing sync" \
|
||||
&& SCWRYPTS__RUN --name scwrypts/environment/synchronize --group scwrypts --type zsh -- --no-prompt \
|
||||
|| FAIL 1 "failure during sync for '$ENV_NAME'" \
|
||||
}
|
||||
;
|
||||
done
|
||||
|
||||
EDIT $ENV_FILES
|
||||
|
||||
SCWRYPTS__RUN --name scwrypts/environment/synchronize --group scwrypts --type zsh -- --no-prompt \
|
||||
|| FAIL 4 'failed to run environment sync' \
|
||||
|
@ -1,8 +0,0 @@
|
||||
#!/bin/zsh
|
||||
DEPENDENCIES+=()
|
||||
REQUIRED_ENV+=()
|
||||
|
||||
CHECK_ENVIRONMENT
|
||||
#####################################################################
|
||||
|
||||
__CHECK_REQUIRED_ENV $@
|
@ -49,39 +49,47 @@ SYNCHRONIZE() {
|
||||
local ENVIRONMENTS ENVIRONMENT_FILES
|
||||
local FILE NAME ENVIRONMENT_FILE
|
||||
|
||||
ENVIRONMENTS=($(SCWRYPTS__GET_ENV_NAMES | sort -r))
|
||||
ENVIRONMENT_FILES=($(
|
||||
GROUP_PIDS=()
|
||||
for GROUP in ${SCWRYPTS_GROUPS}
|
||||
do
|
||||
{
|
||||
ENVIRONMENTS=($(SCWRYPTS__GET_ENV_NAMES | sort -r))
|
||||
ENVIRONMENT_FILES=($(
|
||||
for NAME in ${ENVIRONMENTS[@]}
|
||||
do
|
||||
SCWRYPTS__GET_ENV_FILE $NAME $GROUP
|
||||
done
|
||||
))
|
||||
|
||||
STATUS 'generating working environment files...'
|
||||
for FILE in ${ENVIRONMENT_FILES[@]}
|
||||
do
|
||||
GENERATE_TEMP_ENVIRONMENT_FILE "$FILE"
|
||||
done
|
||||
|
||||
STATUS 'cascading environment values to children...'
|
||||
for NAME in ${ENVIRONMENTS[@]}
|
||||
do
|
||||
SCWRYPTS__GET_ENV_FILE $NAME
|
||||
CASCADE_ENVIRONMENT $NAME
|
||||
done
|
||||
))
|
||||
|
||||
STATUS 'generating working environment files...'
|
||||
for FILE in ${ENVIRONMENT_FILES[@]}
|
||||
do
|
||||
GENERATE_TEMP_ENVIRONMENT_FILE "$FILE"
|
||||
STATUS 'cleaning up working space...'
|
||||
for FILE in ${ENVIRONMENT_FILES[@]}
|
||||
do
|
||||
CLEANUP_ENVIRONMENT_FILE "$FILE"
|
||||
done
|
||||
SUCCESS 'finished sync!'
|
||||
} &
|
||||
GROUP_PIDS+=$!
|
||||
done
|
||||
|
||||
STATUS 'cascading environment values to children...'
|
||||
for NAME in ${ENVIRONMENTS[@]}
|
||||
do
|
||||
CASCADE_ENVIRONMENT $NAME
|
||||
done
|
||||
|
||||
STATUS 'cleaning up working space...'
|
||||
for FILE in ${ENVIRONMENT_FILES[@]}
|
||||
do
|
||||
CLEANUP_ENVIRONMENT_FILE "$FILE"
|
||||
done
|
||||
SUCCESS 'finished sync!'
|
||||
for P in ${GROUP_PIDS[@]}; do wait $P; done
|
||||
}
|
||||
|
||||
#####################################################################
|
||||
|
||||
CASCADE_ENVIRONMENT() {
|
||||
local PARENT_NAME="$1"
|
||||
local PARENT_FILE="$(SCWRYPTS__GET_ENV_FILE $PARENT_NAME).temp"
|
||||
local PARENT_FILE="$(SCWRYPTS__GET_ENV_FILE $PARENT_NAME $GROUP).temp"
|
||||
|
||||
local CHILD_NAMES=($(echo $ENVIRONMENTS | sed 's/ \+/\n/g' |grep "^$PARENT_NAME\\."))
|
||||
[[ ${#CHILD_NAMES[@]} -eq 0 ]] && return 0
|
||||
@ -93,7 +101,7 @@ CASCADE_ENVIRONMENT() {
|
||||
for CHILD_NAME in ${CHILD_NAMES[@]}
|
||||
do
|
||||
STATUS "propagating environment '$PARENT_NAME' to child '$CHILD_NAME'"
|
||||
CHILD_FILE="$(SCWRYPTS__GET_ENV_FILE $CHILD_NAME).temp"
|
||||
CHILD_FILE="$(SCWRYPTS__GET_ENV_FILE $CHILD_NAME $GROUP).temp"
|
||||
CONTENT=$(cat "$CHILD_FILE")
|
||||
echo "$PARENT_VARIABLES" | ADD_LINES
|
||||
echo "$CONTENT" > "$CHILD_FILE"
|
||||
@ -119,7 +127,7 @@ ADD_LINES() {
|
||||
do
|
||||
VARIABLE=$(echo $LINE | sed 's/=.*$//')
|
||||
echo $CONTENT | grep -qi "^$VARIABLE" || {
|
||||
echo $LINE | grep -qi '__[a-z_]\+=' || {
|
||||
echo $LINE | grep -q '__[a-z_]\+=' || {
|
||||
WARNING "skipping variable $(echo $LINE | sed 's/^export //; s/=.*//')
|
||||
(must be included in a template before it can be added)"
|
||||
continue
|
||||
@ -142,6 +150,7 @@ READ_POPULATED_VARIABLES() {
|
||||
| awk '/^[^=]+$/{printf "%s_____",$0;next}7' \
|
||||
| sed 's/\(_____\)\(export\)/\1\n\2/; s/\(_____\)$/\1\n/' \
|
||||
| sed 's/^.*_____.*$/_____&/' \
|
||||
| sed 's/^_____export/export/' \
|
||||
| sed -z 's/[\n
|
||||
] *_____/_____/g' \
|
||||
| grep -v '^$' \
|
||||
|
@ -18,10 +18,18 @@ SETUP_SYMLINK() {
|
||||
[ ! $2 ] && FAIL 1 'must provide SOURCE_CONFIG and TARGET_CONFIG'
|
||||
|
||||
local SOURCE_CONFIG="$1"
|
||||
[ ! -f "$SOURCE_CONFIG" ] && [ ! -d "$SOURCE_CONFIG" ] && FAIL 2 "no such file or directory '$SOURCE_CONFIG'"
|
||||
|
||||
local TARGET_CONFIG="$HOME/.config/$2"
|
||||
|
||||
[ ! -f "$SOURCE_CONFIG" ] && [ ! -d "$SOURCE_CONFIG" ] && [ -f "$TARGET_CONFIG" ] && {
|
||||
INFO 'SOURCE_CONFIG is not tracked; copying from TARGET_CONFIG'
|
||||
mkdir -p "$(dirname "$SOURCE_CONFIG")"
|
||||
cp "$TARGET_CONFIG" "$SOURCE_CONFIG"
|
||||
}
|
||||
[ ! -f "$SOURCE_CONFIG" ] && [ ! -d "$SOURCE_CONFIG" ] && {
|
||||
WARNING "no such file or directory '$SOURCE_CONFIG'"
|
||||
return 0
|
||||
}
|
||||
|
||||
[ ! -d $(dirname "$TARGET_CONFIG") ] && mkdir -p $(dirname "$TARGET_CONFIG")
|
||||
|
||||
[[ $SAFE_SYMLINKS -eq 1 ]] \
|
||||
|
@ -25,6 +25,9 @@ LAUNCH_OR_SHOW() {
|
||||
|
||||
-a, --always-launch invoke executable even if client-class exists
|
||||
-n, --no-resize don't resize the window (ignores -sxy flags)
|
||||
-l, --no-center leave the window wherever it was last positioned
|
||||
|
||||
--has-statusbar-icon (default: false) use if program has a statusbar icon
|
||||
|
||||
-h, --help print this message and exit
|
||||
|
||||
@ -47,6 +50,8 @@ LAUNCH_OR_SHOW() {
|
||||
|
||||
local ALWAYS_LAUNCH=0
|
||||
local RESIZE=1
|
||||
local MOVE=1
|
||||
local MIN_ACTIVE=1
|
||||
|
||||
while [[ $# -gt 0 ]]
|
||||
do
|
||||
@ -58,6 +63,9 @@ LAUNCH_OR_SHOW() {
|
||||
|
||||
-a | --always-launch ) ALWAYS_LAUNCH=1 ;;
|
||||
-n | --no-resize ) RESIZE=0 ;;
|
||||
-l | --no-center ) MOVE=0 ;;
|
||||
|
||||
--has-statusbar-icon ) MIN_ACTIVE=2 ;;
|
||||
|
||||
-h | --help ) USAGE; exit 0 ;;
|
||||
|
||||
@ -78,7 +86,13 @@ LAUNCH_OR_SHOW() {
|
||||
}
|
||||
}
|
||||
|
||||
ERROR_CHECK
|
||||
CHECK_ERRORS
|
||||
|
||||
xrandr | grep primary | awk '{print $4;}' | grep -q '^[0-9]\+$' || {
|
||||
xrandr --output $(xrandr | grep ' connected' | awk '{print $1;}' | head -n1) --primary
|
||||
}
|
||||
|
||||
local CURRENTLY_ACTIVE=$(xdotool search --onlyvisible --classname $CLIENT_CLASS 2>/dev/null | wc -l)
|
||||
|
||||
local LAUNCH_APP=$ALWAYS_LAUNCH
|
||||
STATUS "looking for window process ids"
|
||||
@ -107,11 +121,15 @@ LAUNCH_OR_SHOW() {
|
||||
&& STATUS 'resizing window' \
|
||||
&& i3-msg "[class=$CLIENT_CLASS] resize set $WINDOW_SIZE"
|
||||
|
||||
STATUS 'pulling window from scratchpad to foreground'
|
||||
i3-msg "[class=$CLIENT_CLASS] scratchpad show"
|
||||
[[ $CURRENTLY_ACTIVE -lt $MIN_ACTIVE ]] && {
|
||||
STATUS 'pulling window from scratchpad to foreground'
|
||||
i3-msg "[class=$CLIENT_CLASS] scratchpad show"
|
||||
}
|
||||
|
||||
STATUS 'moving window to center of current screen'
|
||||
i3-msg "[class=$CLIENT_CLASS] move position center"
|
||||
[[ $MOVE -eq 1 ]] && i3-msg "[class=$CLIENT_CLASS] move position center"
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
#####################################################################
|
||||
|
@ -65,7 +65,7 @@ INSTALL() {
|
||||
}
|
||||
}
|
||||
|
||||
ERROR_CHECK
|
||||
CHECK_ERRORS
|
||||
|
||||
####################################################
|
||||
|
||||
|
Reference in New Issue
Block a user