Compare commits

...

5 Commits

Author SHA1 Message Date
fcf492c661 basic runner format; write a MAIN function 2024-02-06 14:06:44 -07:00
a200c1eb22 v3.9.1
=====================================================================

--- Changes ------------------------------

- Moved personal-environment specific scwrypts to wrynegade/dotwryn
2023-12-23 10:23:38 -07:00
f3e70c61cb v3.9.0
=====================================================================

--- Changes ------------------------------

- scwrypts runner has new arguments
  -q/--quiet   allows quiet-mode operation while still logging to logfiles
  -v/--verbose forces verbose mode
    --version  longform required (-v is now for "verbose" mode)

- scwrypts runner now auto-detects certain CLI usage, running in quiet,
  logged mode if pattern match successfully identifies a single scwrypt
  (or when using --name); use --verbose to override this behavior

- 'k exec' no longer requires double '--' if a '--' comes after
  - old : k exec -it my-pod-0 -- -- /bin/sh
  + new : k exec -it my-pod-0 -- /bin/sh
  + still works : k -- exec -it my-pod-0 -- /bin/sh

--- Bug Fixes ----------------------------

- fixed various plugins/kubectl auto-completion settings; arguments
  after '--' or profile number (e.g. 'k 1 get deployments') will now
  appropriately autocomplete in the indicated profile

- helm template functions now work on related .tpl files as well
  (renders from chart root)

- fixed some goofy UTF-8 icons in zsh/lib/utils/io

--- New Features -------------------------

- (experimental) scwrypts zsh plugin for interactive command selection
  (like CTRL+SPACE), but allows you to build command arguments,
  providing help dialogue for the selected command

--- New Scripts --------------------------

- zsh/misc/tally ) helps keep tally-counts of things; helpful when
                   running long scripts "what iteration am I on"
2023-12-11 18:19:37 -07:00
72e831da33 v3.8.0
=====================================================================

--- Changes ------------------------------

- kubectl driver updates; getting better, but still need to fix
  autocomplete in certain circumstances

- added -y|--yes flags to scwrypts to auto-accept user-prompts (use with
  caution)

- figured out the whole mikefarah/yq vs kislyuk/yq thing; use YQ for
  compatiblity

--- Bug fixes ----------------------------

- helm template generation now loads values in a more appropriate order
  which prevents overwrite by the wrong values file
2023-11-22 15:54:16 -07:00
a03885e8db v3.7.8
=====================================================================

--- New Features -------------------------

- --list-envs now shows all available environments
2023-11-13 16:19:05 -07:00
69 changed files with 928 additions and 888 deletions

View File

@ -2,30 +2,45 @@
command -v compdef >/dev/null 2>&1 || return 0 command -v compdef >/dev/null 2>&1 || return 0
##################################################################### #####################################################################
_k() { for CLI in kubectl helm flux
local C=$(k meta get context) do
local NS=$(k meta get namespace) eval "_${CLI[1]}() {
local SUBSESSION=0
echo \${words[2]} | grep -q '^[0-9]\\+$' && SUBSESSION=\${words[2]}
local KUBEWORDS=(kubectl) local PASSTHROUGH_WORDS=($CLI)
[ $C ] && KUBEWORDS+=(--context $C) [[ \$CURRENT -gt 2 ]] && echo \${words[2]} | grep -qv '^[0-9]\\+$' && {
[ $NS ] && KUBEWORDS+=(--namespace $NS) local KUBECONTEXT=\$(k \$SUBSESSION meta get context)
local NAMESPACE=\$(k \$SUBSESSION meta get namespace)
words="$KUBEWORDS ${words[@]:1}" [ \$KUBECONTEXT ] \
_kubectl && PASSTHROUGH_WORDS+=($([[ $CLI =~ ^helm$ ]] && echo '--kube-context' || echo '--context') \$KUBECONTEXT) \
} ;
[ \$NAMESPACE ] \
&& PASSTHROUGH_WORDS+=(--namespace \$NAMESPACE) \
;
}
compdef _k k local DELIMIT_COUNT=0
local WORD
for WORD in \${words[@]:1}
do
case \$WORD in
[0-9]* ) continue ;;
-- )
echo \$words | grep -q 'exec' && ((DELIMIT_COUNT+=1))
[[ \$DELIMIT_COUNT -eq 0 ]] && ((DELIMIT_COUNT+=1)) && continue
;;
esac
PASSTHROUGH_WORDS+=(\"\$WORD\")
done
##################################################################### echo \"\$words\" | grep -q '\\s\\+$' && PASSTHROUGH_WORDS+=(' ')
_h() {
local C=$(k meta get context)
local NS=$(k meta get namespace)
local KUBEWORDS=(kubectl) words=\"\$PASSTHROUGH_WORDS\"
[ $C ] && KUBEWORDS+=(--context $C) _$CLI
[ $NS ] && KUBEWORDS+=(--namespace $NS) }
"
words="$KUBEWORDS ${words[@]:1}" compdef _${CLI[1]} ${CLI[1]}
_helm done
}
compdef _h h

View File

@ -3,6 +3,7 @@
unalias k h >/dev/null 2>&1 unalias k h >/dev/null 2>&1
k() { _SCWRYPTS_KUBECTL_DRIVER kubectl $@; } k() { _SCWRYPTS_KUBECTL_DRIVER kubectl $@; }
h() { _SCWRYPTS_KUBECTL_DRIVER helm $@; } h() { _SCWRYPTS_KUBECTL_DRIVER helm $@; }
f() { _SCWRYPTS_KUBECTL_DRIVER flux $@; }
_SCWRYPTS_KUBECTL_DRIVER() { _SCWRYPTS_KUBECTL_DRIVER() {
@ -57,7 +58,7 @@ _SCWRYPTS_KUBECTL_DRIVER() {
" "
local USAGE__description=" local USAGE__description="
Provides 'k' (kubectl) and 'h' (helm) shorthands to the respective Provides 'k' (kubectl), 'h' (helm), and 'f' (flux) shorthands to the respective
utility. These functions leverage redis and scwrypts environments to utility. These functions leverage redis and scwrypts environments to
allow quick selection of contexts and namespaces usable across all allow quick selection of contexts and namespaces usable across all
active shell instances. active shell instances.
@ -100,18 +101,20 @@ _SCWRYPTS_KUBECTL_DRIVER() {
--subsession ) SUBSESSION=$2; shift 1 ;; --subsession ) SUBSESSION=$2; shift 1 ;;
-n | --namespace ) -n | --namespace )
echo "TODO: set namespace ('$2')" >&2 _SCWRYPTS_KUBECTL_DRIVER kubectl meta set namespace $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 shift 1
;; ;;
-- ) shift 1; break ;; -k | --context | --kube-context )
_SCWRYPTS_KUBECTL_DRIVER kubectl meta set context $2
shift 1
;;
-- )
echo $USER_ARGS | grep -q 'exec' && USER_ARGS+=(--)
shift 1
break
;;
* ) * )
[ ! $CUSTOM_COMMAND ] && { [ ! $CUSTOM_COMMAND ] && {
@ -149,6 +152,7 @@ _SCWRYPTS_KUBECTL_DRIVER() {
[ $CONTEXT ] && [[ $CLI =~ ^helm$ ]] && CLI_ARGS+=(--kube-context $CONTEXT) [ $CONTEXT ] && [[ $CLI =~ ^helm$ ]] && CLI_ARGS+=(--kube-context $CONTEXT)
[ $CONTEXT ] && [[ $CLI =~ ^kubectl$ ]] && CLI_ARGS+=(--context $CONTEXT) [ $CONTEXT ] && [[ $CLI =~ ^kubectl$ ]] && CLI_ARGS+=(--context $CONTEXT)
[ $CONTEXT ] && [[ $CLI =~ ^flux$ ]] && CLI_ARGS+=(--context $CONTEXT)
[[ $STRICT -eq 1 ]] && { [[ $STRICT -eq 1 ]] && {
[ $CONTEXT ] || ERROR "missing kubectl 'context'" [ $CONTEXT ] || ERROR "missing kubectl 'context'"

View File

@ -30,8 +30,15 @@ SCWRYPTS_KUBECTL_CUSTOM_COMMAND_PARSE__meta() {
USAGE__args="set (namespace|context)" USAGE__args="set (namespace|context)"
USAGE__description="interactively set a namespace or context for '$SCWRYPTS_ENV'" USAGE__description="interactively set a namespace or context for '$SCWRYPTS_ENV'"
case $2 in case $2 in
namespace | context ) USER_ARGS+=($1 $2) ;; namespace | context ) USER_ARGS+=($1 $2 $3); [ $3 ] && shift 1 ;;
-h | --help ) HELP=1 ;; -h | --help ) HELP=1 ;;
'' )
: \
&& SCWRYPTS_KUBECTL_CUSTOM_COMMAND__meta set context \
&& SCWRYPTS_KUBECTL_CUSTOM_COMMAND__meta set namespace \
;
return $?
;;
* ) ERROR "cannot set '$2'" ;; * ) ERROR "cannot set '$2'" ;;
esac esac
@ -94,7 +101,7 @@ SCWRYPTS_KUBECTL_CUSTOM_COMMAND__meta() {
;; ;;
set ) set )
scwrypts -n --name set-$2 --type zsh --group kubectl -- --subsession $SUBSESSION >/dev/null \ scwrypts -n --name set-$2 --type zsh --group kubectl -- $3 --subsession $SUBSESSION >/dev/null \
&& SUCCESS "$2 set" && SUCCESS "$2 set"
;; ;;

View File

@ -21,7 +21,6 @@ KUBECTL() {
kubectl ${KUBECTL_ARGS[@]} $@ kubectl ${KUBECTL_ARGS[@]} $@
} }
##################################################################### #####################################################################
KUBECTL__GET_CONTEXT() { REDIS get --prefix "current:context"; } KUBECTL__GET_CONTEXT() { REDIS get --prefix "current:context"; }
@ -87,3 +86,73 @@ KUBECTL__LIST_NAMESPACES() {
echo default echo default
KUBECTL get namespaces -o name | sed 's/^namespace\///' | sort KUBECTL get namespaces -o name | sed 's/^namespace\///' | sort
} }
#####################################################################
KUBECTL__SERVE() {
[ $CONTEXT ] || local CONTEXT=$(KUBECTL__GET_CONTEXT)
[ $CONTEXT ] || ERROR 'must configure a context in which to serve'
[ $NAMESPACE ] || local NAMESPACE=$(KUBECTL__GET_NAMESPACE)
[ $NAMESPACE ] || ERROR 'must configure a namespace in which to serve'
CHECK_ERRORS --no-fail --no-usage || return 1
[ $SERVICE ] && SERVICE=$(KUBECTL__LIST_SERVICES | jq -c "select (.service == \"$SERVICE\")" || echo $SERVICE)
[ $SERVICE ] || local SERVICE=$(KUBECTL__SELECT_SERVICE)
[ $SERVICE ] || ERROR 'must provide or select a service'
KUBECTL__LIST_SERVICES | grep -q "^$SERVICE$"\
|| ERROR "no service '$SERVICE' in '$CONFIG/$NAMESPACE'"
CHECK_ERRORS --no-fail --no-usage || return 1
##########################################
SERVICE_PASSWORD="$(KUBECTL__GET_SERVICE_PASSWORD)"
KUBECTL__SERVICE_PARSE
INFO "attempting to serve ${NAMESPACE}/${SERVICE_NAME}:${SERVICE_PORT}"
[ $SERVICE_PASSWORD ] && INFO "password : $SERVICE_PASSWORD"
KUBECTL port-forward service/$SERVICE_NAME $SERVICE_PORT
}
KUBECTL__SELECT_SERVICE() {
[ $NAMESPACE ] || local NAMESPACE=$(KUBECTL__GET_NAMESPACE)
[ $NAMESPACE ] || return 1
local SERVICES=$(KUBECTL__LIST_SERVICES)
local SELECTED=$({
echo "namespace service port"
echo $SERVICES \
| jq -r '.service + " " + .port' \
| sed "s/^/$NAMESPACE /" \
;
} \
| column -t \
| FZF 'select a service' --header-lines=1 \
| awk '{print $2;}' \
)
echo $SERVICES | jq -c "select (.service == \"$SELECTED\")"
}
KUBECTL__LIST_SERVICES() {
KUBECTL get service --no-headers\
| awk '{print "{\"service\":\""$1"\",\"ip\":\""$3"\",\"port\":\""$5"\"}"}' \
| jq -c 'select (.ip != "None")' \
;
}
KUBECTL__GET_SERVICE_PASSWORD() {
[ $PASSWORD_SECRET ] && [ $PASSWORD_KEY ] || return 0
KUBECTL get secret $PASSWORD_SECRET -o jsonpath="{.data.$PASSWORD_KEY}" \
| base64 --decode
}
KUBECTL__SERVICE_PARSE() {
SERVICE_NAME=$(echo $SERVICE | jq -r .service)
SERVICE_PORT=$(echo $SERVICE | jq -r .port | sed 's|/.*$||')
}

58
plugins/kubectl/serve Executable file
View File

@ -0,0 +1,58 @@
#!/bin/zsh
#####################################################################
DEPENDENCIES+=()
REQUIRED_ENV+=()
use kubectl --group kubectl
CHECK_ENVIRONMENT
#####################################################################
MAIN() {
local USAGE="
usage: [service] [...options...]
args:
service (optional) name of the service to forward locally
options:
--context override context
--namespace override namespace
--subsession REDIS subsession (default 0)
to show a required password on screen, use both:
--password-secret Secret resource
--password-key key within Secret's 'data'
-h, --help show this dialogue and exit
"
local CONTEXT NAMESPACE SERVICE
local SUBSESSION=0
while [[ $# -gt 0 ]]
do
case $1 in
--context ) CONTEXT=$2; shift 1 ;;
--namespace ) NAMESPACE=$2; shift 1 ;;
--subsession ) SUBSESSION=$2; shift 1 ;;
--password-secret ) PASSWORD_SECRET=$2; shift 1 ;;
--password-key ) PASSWORD_KEY=$2; shift 1 ;;
-h | --help ) USAGE; return 0 ;;
* )
[ $SERVICE ] && ERROR "unexpected argument '$2'"
SERVICE=$1
;;
esac
shift 1
done
CHECK_ERRORS
KUBECTL__SERVE
}
#####################################################################
MAIN $@

View File

@ -17,6 +17,8 @@ MAIN() {
options: options:
--subsession REDIS subsession (default 0) --subsession REDIS subsession (default 0)
-h, --help show this dialogue and exit
" "
local CONTEXT local CONTEXT
local SUBSESSION=0 local SUBSESSION=0
@ -26,6 +28,8 @@ MAIN() {
case $1 in case $1 in
--subsession ) SUBSESSION=$2; shift 1 ;; --subsession ) SUBSESSION=$2; shift 1 ;;
-h | --help ) USAGE; return 0 ;;
* ) * )
[ $CONTEXT ] && ERROR "unexpected argument '$2'" [ $CONTEXT ] && ERROR "unexpected argument '$2'"
CONTEXT=$1 CONTEXT=$1

View File

@ -17,6 +17,8 @@ MAIN() {
options: options:
--subsession REDIS subsession (default 0) --subsession REDIS subsession (default 0)
-h, --help show this dialogue and exit
" "
local NAMESPACE local NAMESPACE
local SUBSESSION=0 local SUBSESSION=0
@ -26,6 +28,8 @@ MAIN() {
case $1 in case $1 in
--subsession ) SUBSESSION=$2; shift 1 ;; --subsession ) SUBSESSION=$2; shift 1 ;;
-h | --help ) USAGE; return 0 ;;
* ) * )
[ $NAMESPACE ] && ERROR "unexpected argument '$2'" [ $NAMESPACE ] && ERROR "unexpected argument '$2'"
NAMESPACE=$1 NAMESPACE=$1

165
run
View File

@ -6,22 +6,35 @@ source "${0:a:h}/zsh/lib/import.driver.zsh" || exit 42
__RUN() { __RUN() {
local USAGE=' local USAGE='
usage: scwrypts [OPTIONS ...] SCRIPT -- [SCRIPT OPTIONS ...] usage: scwrypts [... options ...] [patterns] -- [...script options...]
OPTIONS options:
-g, --group <group-name> only use scripts from the indicated group selection
-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
-m, --name <scwrypt-name> only run the script if there is an exact match (requires type and group)
(requires type and group) -g, --group <group-name> only use scripts from the indicated group
-t, --type <type-name> only use scripts of the indicated type
-e, --env <env-name> set environment; overwrites SCWRYPTS_ENV runtime
-n, --no-log skip logging and run in quiet mode -y, --yes auto-accept all [yn] prompts through current scwrypt
-e, --env <env-name> set environment; overwrites SCWRYPTS_ENV
-q, --quiet run in quiet mode
-n, --no-log skip the log file and run in quiet mode
-v, --verbose override quiet mode settings and print all debug dialogue
--update update scwrypts library to latest version alternate commands
-h, --help display this message and exit
-l, --list print out command list and exit
--list-envs print out environment list and exit
--update update scwrypts library to latest version
--version print out scwrypts version and exit
patterns:
- a list of glob patterns to loose-match a scwrypt by name
-v, --version print out scwrypts version and exit script options:
-l, --list print out command list and exit - everything after "--" is forwarded to the scwrypt you run
-h, --help display this message and exit (usually "-- --help" will provide more information)
' '
cd "$SCWRYPTS_ROOT" cd "$SCWRYPTS_ROOT"
@ -30,58 +43,29 @@ __RUN() {
local VARSPLIT SEARCH_GROUP SEARCH_TYPE SEARCH_NAME local VARSPLIT SEARCH_GROUP SEARCH_TYPE SEARCH_NAME
local ALLOW_LOGFILE=1
local VERBOSE=1
[ $CI ] && [ ! $SCWRYPTS_CI_FORCE_NON_VERBOSE ] && VERBOSE=2
local ERROR=0 local ERROR=0
while [[ $# -gt 0 ]] while [[ $# -gt 0 ]]
do do
case $1 in case $1 in
-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]* ) -[a-z][a-z]* )
VARSPLIT=$(echo "$1 " | sed 's/^\(-.\)\(.*\) /\1 -\2/') VARSPLIT=$(echo "$1 " | sed 's/^\(-.\)\(.*\) /\1 -\2/')
set -- $(echo " $VARSPLIT ") ${@:2} set -- $(echo " $VARSPLIT ") ${@:2}
;; ;;
-h | --help )
USAGE
return 0
;;
-n | --no-log )
[ ! $SUBSCWRYPT ] && SUBSCWRYPT=0
shift 1
;;
-e | --env )
[ ! $2 ] && ERROR "missing value for argument $1" && break
[ ! $SUBSCWRYPTS ] \
&& [ $ENV_NAME ] \
&& WARNING 'overwriting session environment' \
;
ENV_NAME="$2" -h | --help ) USAGE; return 0 ;;
STATUS "using CLI environment '$ENV_NAME'" -l | --list ) SCWRYPTS__GET_AVAILABLE_SCWRYPTS; return 0 ;;
shift 2 --list-envs ) SCWRYPTS__GET_ENV_NAMES; return 0 ;;
;; --version )
-l | --list ) echo scwrypts $(git -C "$SCWRYPTS__ROOT__scwrypts" describe --tags)
SCWRYPTS__GET_AVAILABLE_SCWRYPTS
return 0
;;
-v | --version )
echo scwrypts $(cd "$SCWRYPTS__ROOT__scwrypts"; git describe --tags)
return 0 return 0
;; ;;
--update ) --update )
cd "$SCWRYPTS__ROOT__scwrypts" cd "$SCWRYPTS__ROOT__scwrypts"
git fetch --quiet origin main git fetch --quiet origin main
@ -104,24 +88,53 @@ __RUN() {
} }
return 0 return 0
;; ;;
-- )
shift 1 -m | --name )
break # pass arguments after '--' to the scwrypt [ ! $2 ] && ERROR "missing value for argument $1" && break
;; SEARCH_NAME=$2
--* )
ERROR "unrecognized argument '$1'"
shift 1 shift 1
;; ;;
* )
SEARCH_PATTERNS+=($1) -g | --group )
[ ! $2 ] && ERROR "missing value for argument $1" && break
SEARCH_GROUP=$2
shift 1 shift 1
;; ;;
-t | --type )
[ ! $2 ] && ERROR "missing value for argument $1" && break
SEARCH_TYPE=$2
shift 1
;;
-y | --yes ) export __SCWRYPTS_YES=1 ;;
-q | --quiet ) VERBOSE=0 ;;
-n | --no-log ) VERBOSE=0 ; [ ! $SUBSCWRYPT ] && SUBSCWRYPT=0 ;;
-v | --verbose ) VERBOSE=2 ;;
-e | --env )
[ ! $2 ] && ERROR "missing value for argument $1" && break
[ ! $SUBSCWRYPTS ] \
&& [ $ENV_NAME ] \
&& WARNING 'overwriting session environment' \
;
ENV_NAME="$2"
STATUS "using CLI environment '$ENV_NAME'"
shift 1
;;
-- ) shift 1; break ;; # pass arguments after '--' to the scwrypt
--* ) ERROR "unrecognized argument '$1'" ;;
* ) SEARCH_PATTERNS+=($1) ;;
esac esac
shift 1
done done
[ $SEARCH_NAME ] && { [ $SEARCH_NAME ] && {
[ ! $SEARCH_TYPE ] && ERROR '--name requires --type argument' [ $SEARCH_TYPE ] || ERROR '--name requires --type argument'
[ ! $SEARCH_GROUP ] && ERROR '--name requires --group argument' [ $SEARCH_GROUP ] || ERROR '--name requires --group argument'
} }
CHECK_ERRORS CHECK_ERRORS
@ -130,7 +143,7 @@ __RUN() {
local SCWRYPTS_AVAILABLE local SCWRYPTS_AVAILABLE
local POTENTIAL_ERROR="no such scwrypt exists:" local POTENTIAL_ERROR="no such scwrypt exists:"
SCWRYPTS_AVAILABLE=$(SCWRYPTS__GET_AVAILABLE_SCWRYPTS) SCWRYPTS_AVAILABLE=$(SCWRYPTS__GET_AVAILABLE_SCWRYPTS)
[ $SEARCH_NAME ] && { [ $SEARCH_NAME ] && {
@ -195,9 +208,12 @@ __RUN() {
local TYPE="$SEARCH_TYPE" local TYPE="$SEARCH_TYPE"
local GROUP="$SEARCH_GROUP" local GROUP="$SEARCH_GROUP"
[[ $(echo $SCWRYPTS_AVAILABLE | wc -l) -eq 2 ]] \ [[ $(echo $SCWRYPTS_AVAILABLE | wc -l) -eq 2 ]] && {
&& SCWRYPT_SELECTION=$(echo $SCWRYPTS_AVAILABLE | tail -n1) \ SCWRYPT_SELECTION=$(echo $SCWRYPTS_AVAILABLE | tail -n1)
|| SCWRYPT_SELECTION=$(echo $SCWRYPTS_AVAILABLE | FZF "select a script to run" --header-lines 1) [[ $VERBOSE -eq 2 ]] || VERBOSE=0
} || {
SCWRYPT_SELECTION=$(echo $SCWRYPTS_AVAILABLE | FZF "select a script to run" --header-lines 1)
}
[ $SCWRYPT_SELECTION ] || exit 2 [ $SCWRYPT_SELECTION ] || exit 2
SCWRYPTS__SEPARATE_SCWRYPT_SELECTION $SCWRYPT_SELECTION SCWRYPTS__SEPARATE_SCWRYPT_SELECTION $SCWRYPT_SELECTION
@ -240,7 +256,8 @@ __RUN() {
########################################## ##########################################
[ ! $SUBSCWRYPT ] \ : \
&& [ ! $SUBSCWRYPT ] \
&& [[ $ENV_NAME =~ prod ]] \ && [[ $ENV_NAME =~ prod ]] \
&& { __VALIDATE_UPSTREAM_TIMELINE || ABORT; } && { __VALIDATE_UPSTREAM_TIMELINE || ABORT; }
@ -254,6 +271,7 @@ __RUN() {
local LOGFILE=$(__GET_LOGFILE) local LOGFILE=$(__GET_LOGFILE)
local HEADER=$( local HEADER=$(
[[ $VERBOSE -gt 0 ]] || return 0
[ $SUBSCWRYPT ] && return 0 [ $SUBSCWRYPT ] && return 0
echo '=====================================================================' echo '====================================================================='
echo "script : $SCWRYPT_GROUP $SCWRYPT_TYPE $SCWRYPT_NAME" echo "script : $SCWRYPT_GROUP $SCWRYPT_TYPE $SCWRYPT_NAME"
@ -275,14 +293,14 @@ __RUN() {
{ {
[ $HEADER ] && echo $HEADER [ $HEADER ] && echo $HEADER
echo '\033[1;33m--- BEGIN OUTPUT -------------------------\033[0m' [[ $VERBOSE -gt 0 ]] && echo '\033[1;33m--- BEGIN OUTPUT -------------------------\033[0m'
(eval "$RUN_STRING $(printf "%q " "$@")") (eval "$RUN_STRING $(printf "%q " "$@")")
EXIT_CODE=$? EXIT_CODE=$?
echo '\033[1;33m--- END OUTPUT ---------------------------\033[0m' [[ $VERBOSE -gt 0 ]] && echo '\033[1;33m--- END OUTPUT ---------------------------\033[0m'
[[ $EXIT_CODE -eq 0 ]] && EXIT_COLOR='32m' || EXIT_COLOR='31m' [[ $EXIT_CODE -eq 0 ]] && EXIT_COLOR='32m' || EXIT_COLOR='31m'
echo "terminated with\\033[1;$EXIT_COLOR code $EXIT_CODE\\033[0m" [[ $VERBOSE -gt 0 ]] && echo "terminated with\\033[1;$EXIT_COLOR code $EXIT_CODE\\033[0m"
} 2>&1 | tee --append "$LOGFILE" } 2>&1 | tee --append "$LOGFILE"
exit $(\ exit $(\
@ -324,10 +342,9 @@ __VALIDATE_UPSTREAM_TIMELINE() {
} }
__GET_LOGFILE() { __GET_LOGFILE() {
[ $SUBSCWRYPT ] \ [ $SUBSCWRYPT ] && return 0
|| [[ $SCWRYPT_NAME =~ scwrypts/logs ]] \ [[ $SCWRYPT_NAME =~ scwrypts/logs ]] && return 0
|| [[ $SCWRYPT_NAME =~ interactive ]] \ [[ $SCWRYPT_NAME =~ interactive ]] && return 0
&& return 0
echo "$SCWRYPTS_LOG_PATH/$(echo $GROUP/$TYPE/$NAME | sed 's/^\.\///; s/\//\%/g').log" echo "$SCWRYPTS_LOG_PATH/$(echo $GROUP/$TYPE/$NAME | sed 's/^\.\///; s/\//\%/g').log"
} }

View File

@ -6,7 +6,7 @@ SCWRYPTS__ZSH_PLUGIN() {
local NAME local NAME
local TYPE local TYPE
local GROUP local GROUP
zle clear-command-line LBUFFER= RBUFFER=
[ ! $SCWRYPT_SELECTION ] && { zle accept-line; return 0; } [ ! $SCWRYPT_SELECTION ] && { zle accept-line; return 0; }
SCWRYPTS__SEPARATE_SCWRYPT_SELECTION $SCWRYPT_SELECTION SCWRYPTS__SEPARATE_SCWRYPT_SELECTION $SCWRYPT_SELECTION
@ -14,13 +14,40 @@ SCWRYPTS__ZSH_PLUGIN() {
which scwrypts >/dev/null 2>&1\ which scwrypts >/dev/null 2>&1\
&& RBUFFER="scwrypts" || RBUFFER="$SCWRYPTS_ROOT/scwrypts" && RBUFFER="scwrypts" || RBUFFER="$SCWRYPTS_ROOT/scwrypts"
RBUFFER+=" --name $NAME --group $GROUP --type $TYPE" RBUFFER+=" --name $NAME --group $GROUP --type $TYPE --verbose"
zle accept-line zle accept-line
} }
zle -N scwrypts SCWRYPTS__ZSH_PLUGIN zle -N scwrypts SCWRYPTS__ZSH_PLUGIN
bindkey $SCWRYPTS_SHORTCUT scwrypts bindkey $SCWRYPTS_SHORTCUT scwrypts
#####################################################################
SCWRYPTS__ZSH_BUILDER_PLUGIN() {
local SCWRYPT_SELECTION=$(SCWRYPTS__GET_AVAILABLE_SCWRYPTS | FZF 'select a script' --header-lines 1)
local NAME
local TYPE
local GROUP
LBUFFER= RBUFFER=
[ ! $SCWRYPT_SELECTION ] && { zle accept-line; return 0; }
SCWRYPTS__SEPARATE_SCWRYPT_SELECTION $SCWRYPT_SELECTION
scwrypts --name $NAME --group $GROUP --type $TYPE -- --help >&2 || {
zle accept-line
return 0
}
echo
zle reset-prompt
which scwrypts >/dev/null 2>&1\
&& LBUFFER="scwrypts" || LBUFFER="$SCWRYPTS_ROOT/scwrypts"
LBUFFER+=" --name $NAME --group $GROUP --type $TYPE -- "
}
zle -N scwrypts-builder SCWRYPTS__ZSH_BUILDER_PLUGIN
bindkey $SCWRYPTS_BUILDER_SHORTCUT scwrypts-builder
##################################################################### #####################################################################
SCWRYPTS__ZSH_PLUGIN_ENV() { SCWRYPTS__ZSH_PLUGIN_ENV() {
local RESET='reset' local RESET='reset'

View File

@ -1,10 +1,7 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
use cloud/aws/ecr use cloud/aws/ecr
CHECK_ENVIRONMENT
##################################################################### #####################################################################
ECR_LOGIN $@ MAIN() {
ECR_LOGIN $@
}

View File

@ -3,11 +3,9 @@ DEPENDENCIES+=(jq)
REQUIRED_ENV+=(AWS__EFS__LOCAL_MOUNT_POINT) REQUIRED_ENV+=(AWS__EFS__LOCAL_MOUNT_POINT)
use cloud/aws/cli use cloud/aws/cli
CHECK_ENVIRONMENT
##################################################################### #####################################################################
EFS_CONNECT() { MAIN() {
GETSUDO || exit 1 GETSUDO || exit 1
[ ! -d $AWS__EFS__LOCAL_MOUNT_POINT ] && { [ ! -d $AWS__EFS__LOCAL_MOUNT_POINT ] && {
sudo mkdir $AWS__EFS__LOCAL_MOUNT_POINT \ sudo mkdir $AWS__EFS__LOCAL_MOUNT_POINT \
@ -64,6 +62,3 @@ EFS_CONNECT() {
FAIL 2 "unable to mount '$FS_ID'" FAIL 2 "unable to mount '$FS_ID'"
} }
} }
#####################################################################
EFS_CONNECT $@

View File

@ -3,11 +3,9 @@ DEPENDENCIES+=(jq)
REQUIRED_ENV+=(AWS__EFS__LOCAL_MOUNT_POINT) REQUIRED_ENV+=(AWS__EFS__LOCAL_MOUNT_POINT)
use cloud/aws/cli use cloud/aws/cli
CHECK_ENVIRONMENT
##################################################################### #####################################################################
EFS_DISCONNECT() { MAIN() {
[ ! -d "$AWS__EFS__LOCAL_MOUNT_POINT" ] && { [ ! -d "$AWS__EFS__LOCAL_MOUNT_POINT" ] && {
STATUS 'no efs currently mounted' STATUS 'no efs currently mounted'
exit 0 exit 0
@ -32,6 +30,3 @@ EFS_DISCONNECT() {
&& SUCCESS "done" \ && SUCCESS "done" \
|| FAIL 2 "failed to unmount '$EFS'" || FAIL 2 "failed to unmount '$EFS'"
} }
#####################################################################
EFS_DISCONNECT $@

View File

@ -1,10 +1,7 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
use cloud/aws/eks use cloud/aws/eks
CHECK_ENVIRONMENT
##################################################################### #####################################################################
EKS_CLUSTER_LOGIN $@ MAIN() {
EKS__CLUSTER_LOGIN $@
}

View File

@ -1,19 +1,11 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
use cloud/aws/rds use cloud/aws/rds
use db/postgres use db/postgres
CHECK_ENVIRONMENT
##################################################################### #####################################################################
CREATE_BACKUP() { MAIN() {
local DB_HOST DB_PORT DB_NAME DB_USER DB_PASS local DB_HOST DB_PORT DB_NAME DB_USER DB_PASS
RDS__GET_DATABASE_CREDENTIALS $@ || return 1 RDS__GET_DATABASE_CREDENTIALS $@ || return 1
PG_DUMP PG_DUMP
} }
#####################################################################
CREATE_BACKUP $@

View File

@ -1,20 +1,11 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
use cloud/aws/rds use cloud/aws/rds
use db/postgres use db/postgres
CHECK_ENVIRONMENT
##################################################################### #####################################################################
RDS_INTERACTIVE_LOGIN() { MAIN() {
local DB_HOST DB_PORT DB_NAME DB_USER DB_PASS local DB_HOST DB_PORT DB_NAME DB_USER DB_PASS
RDS__GET_DATABASE_CREDENTIALS $@ || return 1 RDS__GET_DATABASE_CREDENTIALS $@ || return 1
POSTGRES__LOGIN_INTERACTIVE POSTGRES__LOGIN_INTERACTIVE
} }
#####################################################################
RDS_INTERACTIVE_LOGIN $@

View File

@ -1,20 +1,11 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
use cloud/aws/rds use cloud/aws/rds
use db/postgres use db/postgres
CHECK_ENVIRONMENT
##################################################################### #####################################################################
LOAD_BACKUP() { MAIN() {
local DB_HOST DB_PORT DB_NAME DB_USER DB_PASS local DB_HOST DB_PORT DB_NAME DB_USER DB_PASS
RDS__GET_DATABASE_CREDENTIALS $@ || return 1 RDS__GET_DATABASE_CREDENTIALS $@ || return 1
PG_RESTORE PG_RESTORE
} }
#####################################################################
LOAD_BACKUP $@

View File

@ -1,11 +1,9 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=(cli53) DEPENDENCIES+=(cli53)
REQUIRED_ENV+=(AWS_PROFILE) REQUIRED_ENV+=(AWS_PROFILE)
CHECK_ENVIRONMENT
##################################################################### #####################################################################
ROUTE53_BACKUP() { MAIN() {
local BACKUP_PATH="$SCWRYPTS_OUTPUT_PATH/$ENV_NAME/aws-dns-backup/$(date '+%Y-%m-%d')" local BACKUP_PATH="$SCWRYPTS_OUTPUT_PATH/$ENV_NAME/aws-dns-backup/$(date '+%Y-%m-%d')"
mkdir -p $BACKUP_PATH >/dev/null 2>&1 mkdir -p $BACKUP_PATH >/dev/null 2>&1
@ -25,12 +23,11 @@ ROUTE53_BACKUP() {
for P in ${JOBS[@]}; do wait $P >/dev/null 2>&1; done for P in ${JOBS[@]}; do wait $P >/dev/null 2>&1; done
} }
#####################################################################
ROUTE53_GET_DOMAINS() { ROUTE53_GET_DOMAINS() {
cli53 list --profile $AWS_PROFILE \ cli53 list --profile $AWS_PROFILE \
| awk '{print $2;}' \ | awk '{print $2;}' \
| sed '1d; s/\.$//'\ | sed '1d; s/\.$//'\
; ;
} }
#####################################################################
ROUTE53_BACKUP

View File

@ -1,10 +1,7 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
use cloud/media-sync use cloud/media-sync
CHECK_ENVIRONMENT
##################################################################### #####################################################################
MEDIA_SYNC__PULL $@ MAIN() {
MEDIA_SYNC__PULL $@
}

View File

@ -1,10 +1,7 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
use cloud/media-sync use cloud/media-sync
CHECK_ENVIRONMENT
##################################################################### #####################################################################
MEDIA_SYNC__PUSH $@ MAIN() {
MEDIA_SYNC__PUSH $@
}

View File

@ -1,9 +1,7 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
use db/postgres use db/postgres
CHECK_ENVIRONMENT
##################################################################### #####################################################################
POSTGRES__LOGIN_INTERACTIVE $@
MAIN() {
POSTGRES__LOGIN_INTERACTIVE $@
}

View File

@ -1,9 +1,7 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
use db/postgres use db/postgres
CHECK_ENVIRONMENT
##################################################################### #####################################################################
PG_DUMP $@
MAIN() {
PG_DUMP $@
}

View File

@ -1,9 +1,7 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
use db/postgres use db/postgres
CHECK_ENVIRONMENT
##################################################################### #####################################################################
PG_RESTORE $@
MAIN() {
PG_RESTORE $@
}

View File

@ -1,13 +1,9 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
use db/postgres use db/postgres
CHECK_ENVIRONMENT
##################################################################### #####################################################################
RUN_SQL_POSTGRES() { MAIN() {
WARNING " \nthis function is in a beta state\n "
local _PASS _ARGS=() local _PASS _ARGS=()
POSTGRES__SET_LOGIN_ARGS $@ POSTGRES__SET_LOGIN_ARGS $@
@ -43,9 +39,3 @@ RUN_SQL_POSTGRES() {
&& SUCCESS "finished running '$INPUT_FILE'" \ && SUCCESS "finished running '$INPUT_FILE'" \
|| FAIL 3 "something went wrong running '$INPUT_FILE' (see above)" || FAIL 3 "something went wrong running '$INPUT_FILE' (see above)"
} }
#####################################################################
WARNING
WARNING 'this function is in a beta state'
WARNING
RUN_SQL_POSTGRES $@

View File

@ -1,11 +1,8 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=(docker) DEPENDENCIES+=(docker)
REQUIRED_ENV+=()
CHECK_ENVIRONMENT
##################################################################### #####################################################################
DOCKER_CLEAN() { MAIN() {
WARNING 'this will prune all docker resources from the current machine' WARNING 'this will prune all docker resources from the current machine'
WARNING 'pruned resources are PERMANENTLY DELETED' WARNING 'pruned resources are PERMANENTLY DELETED'
yN 'continue?' || return 1 yN 'continue?' || return 1
@ -14,6 +11,3 @@ DOCKER_CLEAN() {
SUCCESS "IMAGE : $(docker image prune -f 2>/dev/null | tail -n 1)" SUCCESS "IMAGE : $(docker image prune -f 2>/dev/null | tail -n 1)"
SUCCESS "VOLUME : $(docker volume prune -f 2>/dev/null | tail -n 1)" SUCCESS "VOLUME : $(docker volume prune -f 2>/dev/null | tail -n 1)"
} }
#####################################################################
DOCKER_CLEAN $@

View File

@ -1,8 +1,4 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=() MAIN() {
REQUIRED_ENV+=() SUCCESS 'hello world!'
}
CHECK_ENVIRONMENT
#####################################################################
SUCCESS 'hello world!'

View File

@ -1,17 +1,9 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
use helm use helm
use scwrypts use scwrypts
CHECK_ENVIRONMENT
##################################################################### #####################################################################
MAIN() { MAIN() {
unset USAGE unset USAGE
HELM__TEMPLATE__GET $@ HELM__TEMPLATE__GET $@
} }
#####################################################################
MAIN $@

View File

@ -1,17 +1,9 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
use helm use helm
use scwrypts use scwrypts
CHECK_ENVIRONMENT
##################################################################### #####################################################################
MAIN() { MAIN() {
unset USAGE unset USAGE
HELM__DEPENDENCY__UPDATE $@ HELM__DEPENDENCY__UPDATE $@
} }
#####################################################################
MAIN $@

View File

@ -1,19 +1,44 @@
##################################################################### #####################################################################
DEPENDENCIES+=( DEPENDENCIES+=(kubectl yq)
kubectl REQUIRED_ENV+=()
)
REQUIRED_ENV+=(
AWS_ACCOUNT
AWS_REGION
)
use cloud/aws/cli use cloud/aws/cli
##################################################################### #####################################################################
EKS_CLUSTER_LOGIN() { EKS__KUBECTL() { EKS kubectl $@; }
EKS__FLUX() { EKS flux $@; }
#####################################################################
EKS() {
local USAGE="
usage: cli [...kubectl args...]
args:
cli a kubectl-style CLI (e.g. kubectl, helm, flux, etc)
Allows access to kubernetes CLI commands by configuring environment
to point to a specific cluster.
"
REQUIRED_ENV=(AWS_REGION AWS_ACCOUNT CLUSTER_NAME) DEPENDENCIES=(kubectl $1) CHECK_ENVIRONMENT || return 1
local CONTEXT="arn:aws:eks:${AWS_REGION}:${AWS_ACCOUNT}:cluster/${CLUSTER_NAME}"
local CONTEXT_ARGS=()
case $1 in
helm ) CONTEXT_ARGS+=(--kube-context $CONTEXT) ;;
* ) CONTEXT_ARGS+=(--context $CONTEXT) ;;
esac
$1 ${CONTEXT_ARGS[@]} ${@:2}
}
#####################################################################
EKS__CLUSTER_LOGIN() {
local USAGE=" local USAGE="
usage: [...options...] usage: [...options...]
@ -25,6 +50,7 @@ EKS_CLUSTER_LOGIN() {
cluster in EKS. Also creates the kubeconfig entry if it does not cluster in EKS. Also creates the kubeconfig entry if it does not
already exist. already exist.
" "
REQUIRED_ENV=(AWS_ACCOUNT AWS_REGION) CHECK_ENVIRONMENT || return 1
local CLUSTER_NAME local CLUSTER_NAME

View File

@ -0,0 +1,116 @@
#####################################################################
DEPENDENCIES+=(eksctl)
REQUIRED_ENV+=()
use cloud/aws/eks
#####################################################################
EKSCTL() {
REQUIRED_ENV=(AWS_PROFILE AWS_REGION) CHECK_ENVIRONMENT || return 1
AWS_PROFILE=$AWS_PROFILE AWS_REGION=$AWS_REGION \
eksctl $@
}
EKSCTL__CREATE_IAMSERVICEACCOUNT() {
local USAGE="
usage: serviceaccount-name namespace [...options...] -- [...'eksctl create iamserviceaccount' args...]
options:
--serviceaccount (required) target k8s:ServiceAccount
--namespace (required) target k8s:Namespace
--role-name (required) name of the IAM role to assign
--force don't check for existing serviceaccount and override any existing configuration
eksctl create iamserviceaccount args:
$(eksctl create iamserviceaccount --help 2>&1 | grep -v -- '--name' | grep -v -- '--namespace' | grep -v -- '--role-name' | sed 's/^/ /')
"
REQUIRED_ENV=(AWS_REGION AWS_ACCOUNT CLUSTER_NAME) CHECK_ENVIRONMENT || return 1
local SERVICEACCOUNT NAMESPACE ROLE_NAME
local FORCE=0
local EKSCTL_ARGS=()
while [[ $# -gt 0 ]]
do
case $1 in
--serviceaccount ) SERVICEACCOUNT=$2; shift 1 ;;
--namespace ) NAMESPACE=$2; shift 1 ;;
--role-name ) ROLE_NAME=$2; shift 1 ;;
--force ) FORCE=1 ;;
-- ) shift 1; break ;;
* ) ERROR "unknown argument '$1'" ;;
esac
shift 1
done
while [[ $# -gt 0 ]]; do EKSCTL_ARGS+=($1); shift 1; done
[ $SERVICEACCOUNT ] || ERROR "--serviceaccount is required"
[ $NAMESPACE ] || ERROR "--namespace is required"
[ $ROLE_NAME ] || ERROR "--role-name is required"
CHECK_ERRORS --no-fail || return 1
##########################################
[[ $FORCE -eq 0 ]] && {
_EKS__CHECK_IAMSERVICEACCOUNT_EXISTS
local EXISTS_STATUS=$?
case $EXISTS_STATUS in
0 )
SUCCESS "'$NAMESPACE/$SERVICEACCOUNT' already configured with '$ROLE_NAME'"
return 0
;;
1 ) ;; # role does not exist yet; continue with rollout
2 )
ERROR "'$NAMESPACE/$SERVICEACCOUNT' has been configured with a different role than '$ROLE_NAME'"
REMINDER "must use --force flag to overwrite"
return 2
;;
esac
}
STATUS "creating iamserviceaccount" \
&& EKSCTL create iamserviceaccount \
--cluster $CLUSTER_NAME \
--namespace $NAMESPACE \
--name $SERVICEACCOUNT \
--role-name $ROLE_NAME \
--override-existing-serviceaccounts \
--approve \
${EKSCTL_ARGS[@]} \
&& SUCCESS "successfully configured '$NAMESPACE/$SERVICEACCOUNT' with IAM role '$ROLE_NAME'" \
|| { ERROR "unable to configure '$NAMESPACE/$SERVICEACCOUNT' with IAM role '$ROLE_NAME' (check cloudformation dashboard for details)"; return 3; }
}
_EKS__CHECK_IAMSERVICEACCOUNT_EXISTS() {
STATUS "checking for existing role-arn"
local CURRENT_ROLE_ARN=$(
EKS__KUBECTL --namespace $NAMESPACE get serviceaccount $SERVICEACCOUNT -o yaml \
| YQ -r '.metadata.annotations["eks.amazonaws.com/role-arn"]' \
| grep -v '^null$' \
)
[ $CURRENT_ROLE_ARN ] || {
STATUS "serviceaccount does not exist or has no configured role"
return 1
}
[[ $CURRENT_ROLE_ARN =~ "$ROLE_NAME$" ]] || {
STATUS "serviceaccount current role does not match desired role:
CURRENT : $CURRENT_ROLE_ARN
DESIRED : arn:aws:iam::${AWS_ACCOUNT}:role/$ROLE_NAME
"
return 2
}
STATUS "serviceaccount current role matches desired role"
return 0
}

Binary file not shown.

View File

@ -4,6 +4,7 @@ DEPENDENCIES+=(helm kubeval)
REQUIRED_ENV+=() REQUIRED_ENV+=()
use helm/validate use helm/validate
use scwrypts
##################################################################### #####################################################################
@ -17,6 +18,8 @@ HELM__TEMPLATE__GET() {
--colorize use 'bat' to colorize output --colorize use 'bat' to colorize output
--raw remove scwrypts-added fluff and only output helm template details --raw remove scwrypts-added fluff and only output helm template details
-h, --help show this help dialogue
Smart helm-template generator which auto-detects the chart Smart helm-template generator which auto-detects the chart
and sample values for testing and developing helm charts. and sample values for testing and developing helm charts.
" "
@ -35,8 +38,11 @@ HELM__TEMPLATE__GET() {
;; ;;
--raw ) RAW=1 ;; --raw ) RAW=1 ;;
-h | --help ) USAGE; return 0 ;;
-- ) shift 1; break ;; -- ) shift 1; break ;;
* ) HELM_ARGS+=($1) ;; * ) HELM_ARGS+=($1) ;;
esac esac
shift 1 shift 1
@ -60,6 +66,7 @@ HELM__TEMPLATE__GET() {
[ ! $TEMPLATE_OUTPUT ] && EXIT_CODE=1 [ ! $TEMPLATE_OUTPUT ] && EXIT_CODE=1
[[ $RAW -eq 1 ]] && { [[ $RAW -eq 1 ]] && {
[ $USE_CHART_ROOT ] && [[ $USE_CHART_ROOT -eq 1 ]] || HELM_ARGS+=(--show-only $(echo $TEMPLATE_FILENAME | sed "s|^$CHART_ROOT/||")) [ $USE_CHART_ROOT ] && [[ $USE_CHART_ROOT -eq 1 ]] || HELM_ARGS+=(--show-only $(echo $TEMPLATE_FILENAME | sed "s|^$CHART_ROOT/||"))
[[ $COLORIZE -eq 1 ]] \ [[ $COLORIZE -eq 1 ]] \

View File

@ -27,13 +27,20 @@ HELM__VALIDATE() {
return 1 return 1
} }
CHART_NAME=$(yq -r .name "$CHART_ROOT/Chart.yaml") CHART_NAME=$(YQ -r .name "$CHART_ROOT/Chart.yaml")
[[ $TEMPLATE_FILENAME =~ values*.yaml$ ]] && { [[ $TEMPLATE_FILENAME =~ values.*.yaml$ ]] && {
HELM_ARGS+=(--values $TEMPLATE_FILENAME) HELM_ARGS+=(--values $TEMPLATE_FILENAME)
USE_CHART_ROOT=1 USE_CHART_ROOT=1
} }
[[ $TEMPLATE_FILENAME =~ tests/.*.yaml$ ]] && {
HELM_ARGS+=(--values $TEMPLATE_FILENAME)
USE_CHART_ROOT=1
}
[[ $TEMPLATE_FILENAME =~ .tpl$ ]] \
&& USE_CHART_ROOT=1
[[ $(dirname $TEMPLATE_FILENAME) =~ ^$CHART_ROOT$ ]] \ [[ $(dirname $TEMPLATE_FILENAME) =~ ^$CHART_ROOT$ ]] \
&& USE_CHART_ROOT=1 && USE_CHART_ROOT=1
@ -54,9 +61,18 @@ _HELM__GET_CHART_ROOT() {
} }
_HELM__GET_DEFAULT_VALUES_ARGS() { _HELM__GET_DEFAULT_VALUES_ARGS() {
for F in \
"$CHART_ROOT/tests/default.yaml" \
"$CHART_ROOT/values.test.yaml" \
"$CHART_ROOT/values.yaml" \
;
do
[ -f "$F" ] && HELM_ARGS=(--values "$F" $HELM_ARGS)
done
for LOCAL_REPOSITORY in $(\ for LOCAL_REPOSITORY in $(\
cat "$CHART_ROOT/Chart.yaml" \ cat "$CHART_ROOT/Chart.yaml" \
| yq -r '.dependencies[] | .repository' \ | YQ -r '.dependencies[] | .repository' \
| grep '^file://' \ | grep '^file://' \
| sed 's|file://||' \ | sed 's|file://||' \
) )
@ -67,22 +83,13 @@ _HELM__GET_DEFAULT_VALUES_ARGS() {
; ;
for F in \ for F in \
"$LOCAL_REPOSITORY_ROOT/values.yaml" \
"$LOCAL_REPOSITORY_ROOT/values.test.yaml" \
"$LOCAL_REPOSITORY_ROOT/tests/default.yaml" \ "$LOCAL_REPOSITORY_ROOT/tests/default.yaml" \
"$LOCAL_REPOSITORY_ROOT/values.test.yaml" \
"$LOCAL_REPOSITORY_ROOT/values.yaml" \
; ;
do do
[ -f "$F" ] && HELM_ARGS+=(--values "$F") [ -f "$F" ] && HELM_ARGS=(--values "$F" $HELM_ARGS)
done done
done done
for F in \
"$CHART_ROOT/values.yaml" \
"$CHART_ROOT/values.test.yaml" \
"$CHART_ROOT/tests/default.yaml" \
;
do
[ -f "$F" ] && HELM_ARGS+=(--values "$F")
done
} }

View File

@ -0,0 +1,106 @@
#####################################################################
DEPENDENCIES+=()
REQUIRED_ENV+=()
#####################################################################
TALLY_USE_REDIS=false # maybe someday
TALLY_PATH="$SCWRYPTS_DATA_PATH/tally"
#####################################################################
TALLY() {
local USAGE="
usage: [...options...]
options:
-c, --increment-count increment the tally by this much (default 1)
-n, --tally-name name of tally system (default 'default')
-g, --get only output the current value
-s, --set set the tally to a specific value
-r, --reset set the tally back to zero
--raw only output the tally value
-h, --help print this dialogue and exit
Simple tally mark system; keep track of a count.
"
local INCREMENT_COUNT=1
local TALLY_NAME=default
local RAW=false
local SET_VALUE=
while [[ $# -gt 0 ]]
do
case $1 in
-c | --increment-count ) INCREMENT_COUNT=$2; shift 1 ;;
-n | --tally-name ) TALLY_NAME=$2; shift 1 ;;
-g | --get ) INCREMENT_COUNT=0 ;;
-s | --set ) SET_VALUE=$2; shift 1 ;;
-r | --reset ) SET_VALUE=0 ;;
--raw ) RAW=true ;;
-h | --help ) USAGE; return 0 ;;
* ) ERROR "unknown argument '$1'" ;;
esac
shift 1
done
[ $TALLY_NAME ] && echo "$TALLY_NAME" | grep -qv '/' \
|| ERROR "invalid tally name '$TALLY_NAME'"
local TALLY_FILENAME="$TALLY_PATH/$TALLY_NAME.txt"
CHECK_ERRORS --no-fail || return 1
##########################################
local NEW_VALUE CURRENT_VALUE=0
[ $SET_VALUE ] && NEW_VALUE=$SET_VALUE || {
[ -f "$TALLY_FILENAME" ] && {
CURRENT_VALUE=$(cat "$TALLY_FILENAME" | tail -n1 | grep '^[0-9]\+')
}
[ $CURRENT_VALUE ] || {
ERROR "malformed tally file '$TALLY_FILENAME'; aborting"
return 1
}
NEW_VALUE=$(($CURRENT_VALUE + $INCREMENT_COUNT))
}
##########################################
local TALLY_DIR="$(dirname "$TALLY_FILENAME")"
[ -d "$TALLY_DIR" ] || mkdir -p "$TALLY_DIR"
[ -d "$TALLY_DIR" ] || {
ERROR "unable to write to '$TALLY_DIR'; aborting"
return 1
}
echo "# autogenerated tally file; avoid direct modification\n$NEW_VALUE" > "$TALLY_FILENAME" || {
ERROR "failed to write to '$TALLY_FILENAME': aborting"
return 1
}
##########################################
case $RAW in
true ) printf "$NEW_VALUE" ;;
false )
case $TALLY_NAME in
default ) INFO "current tally : $NEW_VALUE" ;;
* ) INFO "$TALLY_NAME : $NEW_VALUE" ;;
esac
esac
}

View File

@ -112,11 +112,28 @@ SCWRYPTS__GET_RUNSTRING() {
SCWRYPTS__GET_RUNSTRING__zsh() { SCWRYPTS__GET_RUNSTRING__zsh() {
__CHECK_DEPENDENCY zsh || return 1 __CHECK_DEPENDENCY zsh || return 1
local SCWRYPT_FILENAME
[ $(eval echo '$SCWRYPTS_TYPE__'$SCWRYPT_GROUP) ] \
&& SCWRYPT_FILENAME="$GROUP_PATH/$SCWRYPT_NAME" \
|| SCWRYPT_FILENAME="$GROUP_PATH/$SCWRYPT_TYPE/$SCWRYPT_NAME" \
;
echo "source '$SCWRYPT_FILENAME'; CHECK_ENVIRONMENT; MAIN"
return 0
}
SCWRYPTS__GET_RUNSTRING__zsh_v3_compatibility() {
__CHECK_DEPENDENCY zsh || return 1
[ $(eval echo '$SCWRYPTS_TYPE__'$SCWRYPT_GROUP) ] \ [ $(eval echo '$SCWRYPTS_TYPE__'$SCWRYPT_GROUP) ] \
&& echo "source $GROUP_PATH/$SCWRYPT_NAME" \ && echo "source $GROUP_PATH/$SCWRYPT_NAME" \
|| echo "source $GROUP_PATH/$SCWRYPT_TYPE/$SCWRYPT_NAME" \ || echo "source $GROUP_PATH/$SCWRYPT_TYPE/$SCWRYPT_NAME" \
; ;
WARNING "scwrypts zsh/v3 runstrings are now deprecated; please update to scwrypts v4 format"
return 0 return 0
} }

View File

@ -17,6 +17,13 @@ __CHECK_DEPENDENCY() {
$E "application '$1' "$([[ $OPTIONAL -eq 1 ]] && echo preferred || echo 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 return 1
} }
[[ $DEPENDENCY =~ ^yq$ ]] && {
yq --version | grep -q mikefarah \
|| WARNING 'detected kislyuk/yq but mikefarah/yq is preferred (compatibility may vary)'
}
return 0
} }
__CHECK_COREUTILS() { __CHECK_COREUTILS() {
@ -36,7 +43,7 @@ __CHECK_COREUTILS() {
done done
[[ $NON_GNU_DEPENDENCY_COUNT -gt 0 ]] && { [[ $NON_GNU_DEPENDENCY_COUNT -gt 0 ]] && {
WARNING 'scripts rely on GNU coreutils; functionality may be limited' WARNING 'scripts rely on GNU coreutils; compatibility may vary'
IS_MACOS && REMINDER 'GNU coreutils can be installed and linked through Homebrew' IS_MACOS && REMINDER 'GNU coreutils can be installed and linked through Homebrew'
} }

View File

@ -43,11 +43,11 @@ SUCCESS() { PREFIX="SUCCESS ✔" COLOR=$__GREEN PRINT "$@"; }
WARNING() { PREFIX="WARNING " COLOR=$__ORANGE PRINT "$@"; } WARNING() { PREFIX="WARNING " COLOR=$__ORANGE PRINT "$@"; }
STATUS() { PREFIX="STATUS " COLOR=$__BLUE PRINT "$@"; } STATUS() { PREFIX="STATUS " COLOR=$__BLUE PRINT "$@"; }
REMINDER() { PREFIX="REMINDER " COLOR=$__PURPLE PRINT "$@"; } REMINDER() { PREFIX="REMINDER " COLOR=$__PURPLE PRINT "$@"; }
INFO() { PREFIX="INFO " COLOR=$__WHITE PRINT "$@"; } INFO() { PREFIX="INFO " COLOR=$__WHITE PRINT "$@"; }
PROMPT() { PROMPT() {
PREFIX="PROMPT " COLOR=$__CYAN PRINT "$@" PREFIX="PROMPT " COLOR=$__CYAN PRINT "$@"
PREFIX="USER " COLOR=$__CYAN PRINT '' --no-line-end PREFIX="USER " COLOR=$__CYAN PRINT '' --no-line-end
} }
FAIL() { ERROR "${@:2}"; exit $1; } FAIL() { ERROR "${@:2}"; exit $1; }
@ -142,6 +142,7 @@ INPUT() {
Yn() { Yn() {
PROMPT "$@ [Yn]" PROMPT "$@ [Yn]"
[ $CI ] && { echo y; return 0; } [ $CI ] && { echo y; return 0; }
[ $__SCWRYPTS_YES ] && [[ $__SCWRYPTS_YES -eq 1 ]] && { echo y; return 0; }
local Yn; READ -k Yn; echo >&2 local Yn; READ -k Yn; echo >&2
[[ $Yn =~ [nN] ]] && return 1 || return 0 [[ $Yn =~ [nN] ]] && return 1 || return 0
@ -150,6 +151,7 @@ Yn() {
yN() { yN() {
PROMPT "$@ [yN]" PROMPT "$@ [yN]"
[ $CI ] && { echo y; return 0; } [ $CI ] && { echo y; return 0; }
[ $__SCWRYPTS_YES ] && [[ $__SCWRYPTS_YES -eq 1 ]] && { echo y; return 0; }
local yN; READ -k yN; echo >&2 local yN; READ -k yN; echo >&2
[[ $yN =~ [yY] ]] && return 0 || return 1 [[ $yN =~ [yY] ]] && return 0 || return 1
@ -218,3 +220,12 @@ EDIT() {
$EDITOR $@ </dev/tty >/dev/tty $EDITOR $@ </dev/tty >/dev/tty
SUCCESS "finished editing '$1'!" SUCCESS "finished editing '$1'!"
} }
YQ() {
yq --version | grep -q mikefarah || {
yq $@
return $?
}
yq eval '... comments=""' | yq $@
}

View File

@ -1,13 +1,8 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
use media/youtube use media/youtube
CHECK_ENVIRONMENT
##################################################################### #####################################################################
DOWNLOAD_VIDEO() { MAIN() {
local URLS=($@) local URLS=($@)
[[ ${#URLS[@]} -eq 0 ]] && URLS=($(echo '' | FZF_HEAD 'enter URL')) [[ ${#URLS[@]} -eq 0 ]] && URLS=($(echo '' | FZF_HEAD 'enter URL'))
@ -23,6 +18,3 @@ DOWNLOAD_VIDEO() {
&& SUCCESS "downloaded to '$YT__OUTPUT_DIR/$FILENAME'" \ && SUCCESS "downloaded to '$YT__OUTPUT_DIR/$FILENAME'" \
|| { ERROR "failed to download '$FILENAME'"; return 2; } || { ERROR "failed to download '$FILENAME'"; return 2; }
} }
#####################################################################
DOWNLOAD_VIDEO $@

View File

@ -1,13 +1,8 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
use media/youtube use media/youtube
CHECK_ENVIRONMENT
##################################################################### #####################################################################
GET_AUDIO_CLIP() { MAIN() {
local URLS=($@) local URLS=($@)
[[ ${#URLS[@]} -eq 0 ]] && URLS=($(echo '' | FZF_HEAD 'enter URL')) [[ ${#URLS[@]} -eq 0 ]] && URLS=($(echo '' | FZF_HEAD 'enter URL'))
@ -49,6 +44,3 @@ GET_AUDIO_CLIP() {
&& SUCCESS "created clip '$OUTPUT_FILE'" \ && SUCCESS "created clip '$OUTPUT_FILE'" \
|| { ERROR "error creating clip '$(basename $OUTPUT_FILE)' (see above)"; return 3; } || { ERROR "error creating clip '$(basename $OUTPUT_FILE)' (see above)"; return 3; }
} }
#####################################################################
GET_AUDIO_CLIP $@

8
zsh/misc/tally Executable file
View File

@ -0,0 +1,8 @@
#!/bin/zsh
use misc/tally
#####################################################################
MAIN() {
unset USAGE
TALLY $@
}

View File

@ -1,13 +1,8 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
use office/latex use office/latex
CHECK_ENVIRONMENT
##################################################################### #####################################################################
PDFLATEX() { MAIN() {
[ ! $1 ] && FAIL 1 'must provide filename' [ ! $1 ] && FAIL 1 'must provide filename'
local FILENAME=$(LATEX__GET_MAIN_FILENAME "$1") local FILENAME=$(LATEX__GET_MAIN_FILENAME "$1")
@ -26,6 +21,3 @@ PDFLATEX() {
SUCCESS "created '$(echo $FILENAME | sed 's/\.[^.]*$/.pdf/')'" SUCCESS "created '$(echo $FILENAME | sed 's/\.[^.]*$/.pdf/')'"
} }
#####################################################################
PDFLATEX $@

View File

@ -1,13 +1,8 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
use office/latex use office/latex
CHECK_ENVIRONMENT
##################################################################### #####################################################################
CLEAN_LATEX_LOGFILES() { MAIN() {
local DIRECTORY=$(SCWRYPTS__GET_REALPATH ".") local DIRECTORY=$(SCWRYPTS__GET_REALPATH ".")
[ $1 ] && DIRECTORY="$(dirname "$(LATEX__GET_MAIN_FILENAME "$1")")" [ $1 ] && DIRECTORY="$(dirname "$(LATEX__GET_MAIN_FILENAME "$1")")"
[ $DIRECTORY ] && [ -d $DIRECTORY ] \ [ $DIRECTORY ] && [ -d $DIRECTORY ] \
@ -18,6 +13,3 @@ CLEAN_LATEX_LOGFILES() {
SUCCESS "cleaned up latex artifacts in '$DIRECTORY'" SUCCESS "cleaned up latex artifacts in '$DIRECTORY'"
} }
#####################################################################
CLEAN_LATEX_LOGFILES $@

View File

@ -1,15 +1,10 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
use office/latex use office/latex
CHECK_ENVIRONMENT
##################################################################### #####################################################################
TEMPLATE_DIR="${0:a:h}/templates" TEMPLATE_DIR="${0:a:h}/templates"
CREATE_NEW_LATEX_DOCUMENT_FROM_TEMPLATE() { MAIN() {
local DOCUMENT_DIR="$EXECUTION_DIR" local DOCUMENT_DIR="$EXECUTION_DIR"
local TEMPLATE=$(GET_TEMPLATES | FZF 'select a template') local TEMPLATE=$(GET_TEMPLATES | FZF 'select a template')
[ ! $TEMPLATE ] && ABORT [ ! $TEMPLATE ] && ABORT
@ -39,6 +34,8 @@ CREATE_NEW_LATEX_DOCUMENT_FROM_TEMPLATE() {
SUCCESS "finished generating '$(basename $DOCUMENT_FILE)' from '$TEMPLATE'" SUCCESS "finished generating '$(basename $DOCUMENT_FILE)' from '$TEMPLATE'"
} }
#####################################################################
GET_TEMPLATES() { GET_TEMPLATES() {
find "$TEMPLATE_DIR" -type d | sed "s^$TEMPLATE_DIR/*^^; /^$/d" find "$TEMPLATE_DIR" -type d | sed "s^$TEMPLATE_DIR/*^^; /^$/d"
} }
@ -59,4 +56,4 @@ SLUGIFY_TITLE() {
} }
##################################################################### #####################################################################
CREATE_NEW_LATEX_DOCUMENT_FROM_TEMPLATE $@ MAIN $@

View File

@ -1,10 +1,7 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
use office/latex use office/latex
CHECK_ENVIRONMENT
##################################################################### #####################################################################
LATEX__GET_PDF $@ MAIN() {
LATEX__GET_PDF $@
}

View File

@ -1,18 +1,10 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
use office/latex use office/latex
CHECK_ENVIRONMENT
##################################################################### #####################################################################
OPEN_PDF() { MAIN() {
local PDF=$(LATEX__GET_PDF $@) local PDF=$(LATEX__GET_PDF $@)
[ ! $PDF ] && return 1 [ ! $PDF ] && return 1
OPEN "$PDF" OPEN "$PDF"
} }
#####################################################################
OPEN_PDF $@

View File

@ -1,13 +1,8 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
use office/memo use office/memo
CHECK_ENVIRONMENT
##################################################################### #####################################################################
OPEN_MEMO() { MAIN() {
local MEMO_NAME=$(MEMO__LIST_ALL | FZF_TAIL 'select/create a memo') local MEMO_NAME=$(MEMO__LIST_ALL | FZF_TAIL 'select/create a memo')
[ ! "$MEMO_NAME" ] && ABORT [ ! "$MEMO_NAME" ] && ABORT
@ -26,6 +21,3 @@ OPEN_MEMO() {
EDIT "$MEMO_FILE" EDIT "$MEMO_FILE"
} }
#####################################################################
OPEN_MEMO $@

View File

@ -1,13 +1,8 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
use office/memo use office/memo
CHECK_ENVIRONMENT
##################################################################### #####################################################################
DELETE_MEMO() { MAIN() {
local MEMO_NAME=$(MEMO__LIST_ALL | FZF 'select a memo to delete') local MEMO_NAME=$(MEMO__LIST_ALL | FZF 'select a memo to delete')
local MEMO_FILE="$MEMO__DIR/$MEMO_NAME.$MEMO__FILETYPE" local MEMO_FILE="$MEMO__DIR/$MEMO_NAME.$MEMO__FILETYPE"
[ "$MEMO_NAME" ] && [ -f "$MEMO_FILE" ] || ABORT [ "$MEMO_NAME" ] && [ -f "$MEMO_FILE" ] || ABORT
@ -28,6 +23,3 @@ DELETE_MEMO() {
|| FAIL 1 "failed to remove memo '$MEMO_NAME'" \ || FAIL 1 "failed to remove memo '$MEMO_NAME'" \
; ;
} }
#####################################################################
DELETE_MEMO $@

View File

@ -1,13 +1,8 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
use redis use redis
CHECK_ENVIRONMENT
##################################################################### #####################################################################
CURL_WITH_CACHE() { MAIN() {
[ ! $TTL ] && TTL=10 [ ! $TTL ] && TTL=10
[[ $(REDIS__ENABLED) -eq 0 ]] && { [[ $(REDIS__ENABLED) -eq 0 ]] && {
@ -46,7 +41,6 @@ CURL_WITH_CACHE() {
echo $OUTPUT echo $OUTPUT
} }
GET_URL_KEY() { echo "scwrypts:curl:$1" | sed 's/\s\+/+/g'; }
##################################################################### #####################################################################
CURL_WITH_CACHE $@
GET_URL_KEY() { echo "scwrypts:curl:$1" | sed 's/\s\+/+/g'; }

View File

@ -1,36 +1,33 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
use scwrypts/meta use scwrypts/meta
CHECK_ENVIRONMENT
##################################################################### #####################################################################
USER_CONFIG_OVERRIDES="$SCWRYPTS_CONFIG_PATH/config.zsh" MAIN() {
local USER_CONFIG_OVERRIDES="$SCWRYPTS_CONFIG_PATH/config.zsh"
[ ! -f "$USER_CONFIG_OVERRIDES" ] && {
STATUS 'first-time setup detected; creating local configuration override...'
cp "$DEFAULT_CONFIG" "$USER_CONFIG_OVERRIDES"
EDIT $USER_CONFIG_OVERRIDES
STATUS 'attempting first-time build for virtual environments'
SCWRYPTS__RUN --name scwrypts/virtualenv/update-all --group scwrypts --type zsh \
&& SUCCESS 'finished updating virtualenvs' \
|| WARNING 'unable to create one or more virtualenv (see above)' \
;
REMINDER '
in the future, you can use the following scwrypt to update required virtual
environments (equivalent to "npm install" or "pip install -r requirements"):
scwrypts --name scwrypts/virtualenv/update-all --group scwrypts --type zsh [ ! -f "$USER_CONFIG_OVERRIDES" ] && {
' STATUS 'first-time setup detected; creating local configuration override...'
} || { cp "$DEFAULT_CONFIG" "$USER_CONFIG_OVERRIDES"
EDIT "$USER_CONFIG_OVERRIDES"
EDIT $USER_CONFIG_OVERRIDES
STATUS 'attempting first-time build for virtual environments'
SCWRYPTS__RUN --name scwrypts/virtualenv/update-all --group scwrypts --type zsh \
&& SUCCESS 'finished updating virtualenvs' \
|| WARNING 'unable to create one or more virtualenv (see above)' \
;
REMINDER '
in the future, you can use the following scwrypt to update required virtual
environments (equivalent to "npm install" or "pip install -r requirements"):
scwrypts --name scwrypts/virtualenv/update-all --group scwrypts --type zsh
'
} || {
EDIT "$USER_CONFIG_OVERRIDES"
}
SUCCESS 'saved new configuration'
REMINDER 'changes which affect the hot-key plugin will require a ZSHRC reload'
} }
SUCCESS 'saved new configuration'
REMINDER 'changes which affect the hot-key plugin will require a ZSHRC reload'

View File

@ -1,38 +1,35 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
use scwrypts/environment-files use scwrypts/environment-files
CHECK_ENVIRONMENT
##################################################################### #####################################################################
PROMPT 'choose an environment to copy' MAIN() {
TEMPLATE_ENV_NAME=$(SCWRYPTS__SELECT_ENV) PROMPT 'choose an environment to copy'
[ ! $TEMPLATE_ENV_NAME ] && ABORT TEMPLATE_ENV_NAME=$(SCWRYPTS__SELECT_ENV)
[ ! $TEMPLATE_ENV_NAME ] && ABORT
STATUS "selected '$TEMPLATE_ENV_NAME'"
STATUS "selected '$TEMPLATE_ENV_NAME'"
PROMPT 'enter new environment name'
ENV_NAME=$(echo '' | FZF_HEAD 'new environment') PROMPT 'enter new environment name'
[ ! $ENV_NAME ] && ABORT ENV_NAME=$(echo '' | FZF_HEAD 'new environment')
SCWRYPTS__GET_ENV_NAMES | grep -q $ENV_NAME && FAIL 1 "'$ENV_NAME' already exists" [ ! $ENV_NAME ] && ABORT
SCWRYPTS__GET_ENV_NAMES | grep -q $ENV_NAME && FAIL 1 "'$ENV_NAME' already exists"
for GROUP in ${SCWRYPTS_GROUPS[@]}
do for GROUP in ${SCWRYPTS_GROUPS[@]}
TEMPLATE_ENV_FILE=$(SCWRYPTS__GET_ENV_FILE $TEMPLATE_ENV_NAME $GROUP 2>/dev/null) do
ENV_FILE=$(SCWRYPTS__GET_ENV_FILE $ENV_NAME $GROUP 2>/dev/null) 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)
STATUS "creating environment '$ENV_NAME'"
cat "$TEMPLATE_ENV_FILE" \ STATUS "creating environment '$ENV_NAME'"
| sed 's/ # from.*//' \ cat "$TEMPLATE_ENV_FILE" \
> "$ENV_FILE" \ | sed 's/ # from.*//' \
&& SUCCESS "created '$ENV_FILE'" \ > "$ENV_FILE" \
|| FAIL 2 "something went wrong creating '$ENV_FILE'" && SUCCESS "created '$ENV_FILE'" \
done || FAIL 2 "something went wrong creating '$ENV_FILE'"
done
STATUS "synchronizing environments"
SCWRYPTS__RUN --name scwrypts/environment/synchronize --group scwrypts --type zsh -- --no-prompt \ STATUS "synchronizing environments"
&& SUCCESS "finished copy environment '$TEMPLATE_ENV_NAME > $ENV_NAME'" \ SCWRYPTS__RUN --name scwrypts/environment/synchronize --group scwrypts --type zsh -- --no-prompt \
|| FAIL 3 'error during synchronization of new environment (see above)' \ && SUCCESS "finished copy environment '$TEMPLATE_ENV_NAME > $ENV_NAME'" \
; || FAIL 3 'error during synchronization of new environment (see above)' \
;
}

View File

@ -1,36 +1,33 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
use scwrypts/environment-files use scwrypts/environment-files
CHECK_ENVIRONMENT
##################################################################### #####################################################################
PROMPT 'choose an environment to delete' MAIN() {
ENV_NAME=$(SCWRYPTS__SELECT_ENV) PROMPT 'choose an environment to delete'
[ ! $ENV_NAME ] && ABORT ENV_NAME=$(SCWRYPTS__SELECT_ENV)
[ ! $ENV_NAME ] && ABORT
ENV_FILES=($(SCWRYPTS__GET_ENV_FILES $ENV_NAME))
ENV_FILES=($(SCWRYPTS__GET_ENV_FILES $ENV_NAME))
STATUS "preparing to remove '$ENV_NAME'"
STATUS "preparing to remove '$ENV_NAME'"
WARNING "
the '$ENV_NAME' environment will be removed configured options WARNING "
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/^/ - /')
" $(echo $ENV_FILES | sed 's| /|\n - /|g; s/^/ - /')
"
yN 'continue?' || ABORT
yN 'continue?' || ABORT
STATUS "removing environment"
for ENV_FILE in ${ENV_FILES[@]} STATUS "removing environment"
do for ENV_FILE in ${ENV_FILES[@]}
rm "$ENV_FILE" \ do
&& SUCCESS "removed '$ENV_FILE'" \ rm "$ENV_FILE" \
|| ERROR "unable to remove '$ENV_FILE'; is it protected?" \ && SUCCESS "removed '$ENV_FILE'" \
; || ERROR "unable to remove '$ENV_FILE'; is it protected?" \
done ;
done
CHECK_ERRORS -n || FAIL 2 "some errors ocurred when cleaning up $ENV_NAME"
CHECK_ERRORS -n || FAIL 2 "some errors ocurred when cleaning up $ENV_NAME"
}

View File

@ -1,45 +1,42 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
use scwrypts/environment-files use scwrypts/environment-files
CHECK_ENVIRONMENT
##################################################################### #####################################################################
[ $1 ] && ENV_NAME="$1" MAIN() {
[ $1 ] && ENV_NAME="$1"
[ ! $1 ] && {
[ $SCWRYPTS_ENV ] \ [ ! $1 ] && {
&& ENV_NAME=$SCWRYPTS_ENV \ [ $SCWRYPTS_ENV ] \
|| ENV_NAME=$(SCWRYPTS__SELECT_OR_CREATE_ENV) && ENV_NAME=$SCWRYPTS_ENV \
} || ENV_NAME=$(SCWRYPTS__SELECT_OR_CREATE_ENV)
[ ! $ENV_NAME ] && ABORT
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; }
}
[ $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'" \
} }
[ ! $ENV_NAME ] && ABORT
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; }
}
[ $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' \
; ;
done
SUCCESS "environment '$ENV_NAME' successfully modified"
EDIT $ENV_FILES }
SCWRYPTS__RUN --name scwrypts/environment/synchronize --group scwrypts --type zsh -- --no-prompt \
|| FAIL 4 'failed to run environment sync' \
;
SUCCESS "environment '$ENV_NAME' successfully modified"

View File

@ -1,13 +1,8 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
use scwrypts/environment-files use scwrypts/environment-files
CHECK_ENVIRONMENT
##################################################################### #####################################################################
SYNCHRONIZE() { MAIN() {
while [[ $# -gt 0 ]] while [[ $# -gt 0 ]]
do do
case $1 in case $1 in
@ -176,4 +171,4 @@ CLEANUP_ENVIRONMENT_FILE() {
rm "$1.temp" rm "$1.temp"
} }
##################################################################### #####################################################################

View File

@ -1,22 +1,20 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
CHECK_ENVIRONMENT
##################################################################### #####################################################################
cd $SCWRYPTS_ROOT MAIN() {
cd $SCWRYPTS_ROOT
STATUS "Found $(ls $SCWRYPTS_LOG_PATH | wc -l) log files"
WARNING " STATUS "Found $(ls $SCWRYPTS_LOG_PATH | wc -l) log files"
this will permanently clear all local cloud script logs found in WARNING "
'$SCWRYPTS_LOG_PATH' this will permanently clear all local cloud script logs found in
" '$SCWRYPTS_LOG_PATH'
"
yN 'continue?' || ABORT
yN 'continue?' || ABORT
STATUS 'removing logfiles'
rm -rf $SCWRYPTS_LOG_PATH/* \ STATUS 'removing logfiles'
&& SUCCESS 'done' \ rm -rf $SCWRYPTS_LOG_PATH/* \
|| { ERROR 'failed :c'; exit 2; }\ && SUCCESS 'done' \
; || { ERROR 'failed :c'; exit 2; }\
;
}

View File

@ -1,15 +1,13 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
CHECK_ENVIRONMENT
##################################################################### #####################################################################
cd $SCWRYPTS_ROOT MAIN() {
PROMPT 'select a script log' cd $SCWRYPTS_ROOT
LOG_FILE=$(ls -t $SCWRYPTS_LOG_PATH | FZF 'logfile') PROMPT 'select a script log'
[ ! $LOG_FILE ] && { ERROR 'user abort'; exit 1; } LOG_FILE=$(ls -t $SCWRYPTS_LOG_PATH | FZF 'logfile')
[ ! $LOG_FILE ] && { ERROR 'user abort'; exit 1; }
STATUS 'opening logfile'
LESS "$SCWRYPTS_LOG_PATH/$LOG_FILE" STATUS 'opening logfile'
SUCCESS 'done' LESS "$SCWRYPTS_LOG_PATH/$LOG_FILE"
SUCCESS 'done'
}

View File

@ -1,30 +1,27 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
use scwrypts/virtualenv use scwrypts/virtualenv
CHECK_ENVIRONMENT
##################################################################### #####################################################################
while [[ $# -gt 0 ]] MAIN() {
do while [[ $# -gt 0 ]]
case $1 in do
-g | --group ) ENV_GROUP="$2"; shift 1 ;; case $1 in
esac -g | --group ) ENV_GROUP="$2"; shift 1 ;;
shift 1 esac
done shift 1
done
[ ! $ENV_GROUP ] && ENV_GROUP=scwrypts
[ ! $ENV_GROUP ] && ENV_GROUP=scwrypts
ENV_TYPE=$(echo $AVAILABLE_VIRTUALENVS | sed 's/ \+/\n/' | FZF 'select an environment to refresh')
[ ! $ENV_TYPE ] && ABORT ENV_TYPE=$(echo $AVAILABLE_VIRTUALENVS | sed 's/ \+/\n/' | FZF 'select an environment to refresh')
[ ! $ENV_TYPE ] && ABORT
REMINDER "
this will permanently remove all artifacts for the scwrypts $ENV_TYPE environment REMINDER "
(safe unless you have put something important in $(GET_VIRTUALENV_PATH $ENV_GROUP $ENV_TYPE)) this will permanently remove all artifacts for the scwrypts $ENV_TYPE environment
" (safe unless you have put something important in $(GET_VIRTUALENV_PATH $ENV_GROUP $ENV_TYPE))
"
Yn "drop and recreate $ENV_TYPE virtual environment?" || ABORT
Yn "drop and recreate $ENV_TYPE virtual environment?" || ABORT
REFRESH_VIRTUALENV $ENV_GROUP $ENV_TYPE
REFRESH_VIRTUALENV $ENV_GROUP $ENV_TYPE
}

View File

@ -1,25 +1,21 @@
#!/bin/zsh #!/bin/zsh
echo hey
DEPENDENCIES+=()
REQUIRED_ENV+=()
use scwrypts/virtualenv use scwrypts/virtualenv
CHECK_ENVIRONMENT
##################################################################### #####################################################################
STATUS 'beginning update for all environments' MAIN() {
STATUS 'beginning update for all environments'
FAILED_COUNT=0
FAILED_COUNT=0
for ENV_GROUP in ${SCWRYPTS_GROUPS[@]}
do for ENV_GROUP in ${SCWRYPTS_GROUPS[@]}
for ENV_TYPE in ${AVAILABLE_VIRTUALENVS[@]}
do do
UPDATE_VIRTUALENV $ENV_GROUP $ENV_TYPE || ((FAILED_COUNT+=1)) for ENV_TYPE in ${AVAILABLE_VIRTUALENVS[@]}
do
UPDATE_VIRTUALENV $ENV_GROUP $ENV_TYPE || ((FAILED_COUNT+=1))
done
done done
done
[[ $FAILED_COUNT -eq 0 ]] \
[[ $FAILED_COUNT -eq 0 ]] \ && SUCCESS 'all environments up-to-date' \
&& SUCCESS 'all environments up-to-date' \ || FAIL $FAILED_COUNT "failed to update $FAILED_COUNT more environment(s)"
|| FAIL $FAILED_COUNT "failed to update $FAILED_COUNT more environment(s)" }

View File

@ -1,9 +1,7 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
use system/config use system/config
CHECK_ENVIRONMENT
##################################################################### #####################################################################
EDIT "$CONFIG__USER_SETTINGS"
MAIN() {
EDIT "$CONFIG__USER_SETTINGS"
}

View File

@ -1,19 +1,16 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
use system/config use system/config
CHECK_ENVIRONMENT
##################################################################### #####################################################################
SETUP_SYMLINKS() { MAIN() {
while read SYMLINK while read SYMLINK
do do
SETUP_SYMLINK $(echo $SYMLINK | awk '{print $1;}') $(echo $SYMLINK | awk '{print $2}') SETUP_SYMLINK $(echo $SYMLINK | awk '{print $1;}') $(echo $SYMLINK | awk '{print $2}')
done < <(echo $SYMLINKS | sed -n '/^[^#]/p') done < <(echo $SYMLINKS | sed -n '/^[^#]/p')
} }
#####################################################################
SETUP_SYMLINK() { SETUP_SYMLINK() {
[ ! $2 ] && FAIL 1 'must provide SOURCE_CONFIG and TARGET_CONFIG' [ ! $2 ] && FAIL 1 'must provide SOURCE_CONFIG and TARGET_CONFIG'
@ -42,6 +39,3 @@ SETUP_SYMLINK() {
|| FAIL 3 "failed to create link '$TARGET_CONFIG'" \ || FAIL 3 "failed to create link '$TARGET_CONFIG'" \
; ;
} }
#####################################################################
SETUP_SYMLINKS $@

View File

@ -1,13 +1,10 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=(tic) DEPENDENCIES+=(tic)
REQUIRED_ENV+=()
use system/config use system/config
CHECK_ENVIRONMENT
##################################################################### #####################################################################
SETUP_TERMINFO() { MAIN() {
[ ! $TERMINFO_PATH ] && return 0 [ ! $TERMINFO_PATH ] && return 0
[ ! -d $TERMINFO_PATH ] && FAIL 1 "TERMINFO_PATH='$TERMINFO_PATH' does not exist" [ ! -d $TERMINFO_PATH ] && FAIL 1 "TERMINFO_PATH='$TERMINFO_PATH' does not exist"
@ -22,6 +19,3 @@ SETUP_TERMINFO() {
CHECK_ERRORS CHECK_ERRORS
} }
#####################################################################
SETUP_TERMINFO $@

View File

@ -1,13 +1,10 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
use scwrypts/meta use scwrypts/meta
CHECK_ENVIRONMENT
##################################################################### #####################################################################
STATUS 'updating all config files and links' MAIN() {
SCWRYPTS__RUN --name system/config/symlinks --group scwrypts --type zsh || exit 1 STATUS 'updating all config files and links'
SCWRYPTS__RUN --name system/config/terminfo --group scwrypts --type zsh || exit 2 SCWRYPTS__RUN --name system/config/symlinks --group scwrypts --type zsh || exit 1
SUCCESS 'finished updating config files and links' SCWRYPTS__RUN --name system/config/terminfo --group scwrypts --type zsh || exit 2
SUCCESS 'finished updating config files and links'
}

View File

@ -1,102 +0,0 @@
#!/bin/zsh
DEPENDENCIES+=(
diff
)
REQUIRED_ENV+=(
I3__MODEL_CONFIG
)
CHECK_ENVIRONMENT
#####################################################################
REGEX_FONT='^\(font [^0-9]*\)\(.*\)'
REGEX_DMENU="^\\(.*dmenu_run .*-fn '[^0-9]*\\)\\([0-9]*\\)'"
REGEX_BORDER='^\(for_window.*border pixel \)\(.*\)'
INSTALL() {
local USAGE="
usage: [...options...]
options
-f, --force force replacement of existing i3config
-n, --no-link if output config and template are the same, don't create link
-h, --help print this message and exit
environment
I3__MODEL_CONFIG fully-qualified path to sourced i3config
I3__GLOBAL_FONT_SIZE global font size
I3__DMENU_FONT_SIZE (optional) font size for 'dmenu' command
I3__BORDER_PIXEL_SIZE (optional) pixel-width of window borders
I3 provides no way to include dynamic variables in your config.
The main difference I want between my i3 configurations is font-size
to match the current monitor. Since i3-msg provides no way to change
font size, I run this command to update those variables on a local
copy of my sourced config
"
local FORCE=0
local AUTOLINK=1
while [[ $# -gt 0 ]]
do
case $1 in
-f | --force ) FORCE=1 ;;
-n | --no-link ) AUTOLINK=0 ;;
-h | --help ) USAGE; exit 0 ;;
esac
shift 1
done
STATUS 'reading local i3config'
[[ ^$I3__MODEL_CONFIG$ =~ ^$HOME/.config/i3/config$ ]] && {
STATUS "model configuration is default configuration"
I3__MODEL_CONFIG="$I3__MODEL_CONFIG.template"
[ ! -f "$I3__MODEL_CONFIG" ] && {
STATUS "creating template"
cp "$HOME/.config/i3/config" "$I3__MODEL_CONFIG.template"
}
STATUS "referring to '$I3__MODEL_CONFIG'"
}
local CONFIG=$(cat "$I3__MODEL_CONFIG")
[ ! $CONFIG ] && FAIL 1 "failed to read config at '$I3__MODEL_CONFIG'"
local CONFIG_FILE="$HOME/.config/i3/config"
[ ! -d $(dirname "$CONFIG_FILE") ] && mkdir -p "$(dirname "$CONFIG_FILE")"
[ -f "$CONFIG_FILE" ] && mv "$CONFIG_FILE" "$CONFIG_FILE.bak"
[ $I3__GLOBAL_FONT_SIZE ] && {
STATUS "setting global font size to '$I3__GLOBAL_FONT_SIZE'"
CONFIG=$(echo $CONFIG | sed "s/$REGEX_FONT/\\1$I3__GLOBAL_FONT_SIZE/")
}
[ $I3__DMENU_FONT_SIZE ] && {
STATUS "setting dmenu font size to '$I3__DMENU_FONT_SIZE'"
CONFIG=$(echo $CONFIG | sed "s/$REGEX_DMENU/\\1$I3__DMENU_FONT_SIZE'/")
}
[ $I3__BORDER_PIXEL_SIZE ] && {
STATUS "setting border pixel size to '$I3__BORDER_PIXEL_SIZE'"
CONFIG=$(echo $CONFIG | sed "s/$REGEX_BORDER/\\1$I3__BORDER_PIXEL_SIZE/")
}
echo $CONFIG > "$CONFIG_FILE"
[ -f "$CONFIG_FILE.bak" ] \
&& diff "$CONFIG_FILE" "$CONFIG_FILE.bak" -q >/dev/null \
&& mv "$CONFIG_FILE.bak" "$CONFIG_FILE" \
&& INFO "no changes were made" \
;
[[ $AUTOLINK -eq 1 ]] \
&& diff "$CONFIG_FILE" "$I3__MODEL_CONFIG" -q >/dev/null \
&& rm "$CONFIG_FILE" \
&& ln -s "$I3__MODEL_CONFIG" "$CONFIG_FILE" \
&& INFO "output is the same as model, i3config has been linked to model" \
;
[[ $FORCE -eq 1 ]] && rm "$CONFIG.bak" >/dev/null 2>&1
return 0
}
#####################################################################
INSTALL $@

View File

@ -1,136 +0,0 @@
#!/bin/zsh
DEPENDENCIES+=(
i3-msg
xdotool
xrandr
)
REQUIRED_ENV+=()
use system/desktop/notify
CHECK_ENVIRONMENT
#####################################################################
LAUNCH_OR_SHOW() {
INFO $@
local USAGE="
usage: <path-executable> [client-class] [...options...]
options
-c, --client <string> if different from the executable name, xprop CLIENT_CLASS
-s, --scale <value> (default: 0.8 or 0.5 if screen width >3000px)
-x, --x-offset <value> (default: 0.0)
-y, --y-offset <value> (default: 0.0)
-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
Makes it easy to bind appications to key shortcuts without having to
spin up redundant instances or cycle through the scratchpad queue.
Performs a variety of tasks based on states:
1) starts and application
2) adds all instances of the specified application to the scratchpad
3) (toggle) hides all visible instances
4) (toggle) shows all scratchpad-hidden instances
"
local APPLICATION CLIENT_CLASS
local XFFSET=0.0
local YFFSET=0.0
local SCALE=0.8
[[ $(xrandr | grep primary | awk '{print $4;}' | sed 's/x.*//') -gt 3000 ]] \
&& SCALE=0.5
local ALWAYS_LAUNCH=0
local RESIZE=1
local MOVE=1
local MIN_ACTIVE=1
while [[ $# -gt 0 ]]
do
case $1 in
-c | --client ) CLIENT_CLASS="$2"; shift 1 ;;
-x | --x-offset ) XFFSET=$2; shift 1 ;;
-y | --y-offset ) YFFSET=$2; shift 1 ;;
-s | --scale ) SCALE=$2; shift 1 ;;
-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 ;;
* )
[ ! $APPLICATION ] && APPLICATION="$1" \
|| ERROR "extra positional argument '$1'"
esac
shift 1
done
[ ! $APPLICATION ] && ERROR 'path-executable required'
[ ! $CLIENT_CLASS ] && CLIENT_CLASS=$APPLICATION
[ $APPLICATION ] && {
__CHECK_DEPENDENCY $APPLICATION || {
ERROR "$APPLICATION is not installed"
NOTIFY "ERROR: $APPLICATION not found"
}
}
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"
xdotool search --class $CLIENT_CLASS || LAUNCH_APP=1
[[ $LAUNCH_APP -eq 1 ]] && {
STATUS 'launching application'
i3-msg "exec --no-startup-id $APPLICATION;"
sleep .5
}
STATUS 'getting target window size'
WINDOW_SIZE=$(\
xrandr \
| grep 'connected primary' \
| sed 's/.*connected primary \([^x]*\)x\([^+]*\).*/\1 \2/' \
| awk -v f=$SCALE -v x=$XFFSET -v y=$YFFSET \
'{print int($1*f+x)," ",int($2*f+y);}'\
)
INFO "window size: $WINDOW_SIZE"
STATUS 'moving window to scratchpad'
i3-msg "[class=$CLIENT_CLASS] move scratchpad"
[[ $RESIZE -eq 1 ]] \
&& STATUS 'resizing window' \
&& i3-msg "[class=$CLIENT_CLASS] resize set $WINDOW_SIZE"
[[ $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'
[[ $MOVE -eq 1 ]] && i3-msg "[class=$CLIENT_CLASS] move position center"
return 0
}
#####################################################################
LAUNCH_OR_SHOW $@

View File

@ -1,9 +1,7 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
use scwrypts/meta use scwrypts/meta
CHECK_ENVIRONMENT
##################################################################### #####################################################################
SCWRYPTS__RUN --name system/packages/install --group scwrypts --type zsh -- --only-build $@
MAIN() {
SCWRYPTS__RUN --name system/packages/install --group scwrypts --type zsh -- --only-build $@
}

View File

@ -1,9 +1,7 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
use scwrypts/meta use scwrypts/meta
CHECK_ENVIRONMENT
##################################################################### #####################################################################
SCWRYPTS__RUN --name system/packages/install --group scwrypts --type zsh -- --only-pull $@
MAIN() {
SCWRYPTS__RUN --name system/packages/install --group scwrypts --type zsh -- --only-pull $@
}

View File

@ -1,13 +1,8 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
use system/packages/git use system/packages/git
CHECK_ENVIRONMENT
##################################################################### #####################################################################
INSTALL() { MAIN() {
local USAGE=" local USAGE="
usage: [...options...] usage: [...options...]
@ -86,6 +81,3 @@ INSTALL() {
[[ $SKIP_BUILD -eq 1 ]] && return 0 [[ $SKIP_BUILD -eq 1 ]] && return 0
BUILD BUILD
} }
#####################################################################
INSTALL $@

View File

@ -1,9 +1,7 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
use scwrypts/meta use scwrypts/meta
CHECK_ENVIRONMENT
##################################################################### #####################################################################
SCWRYPTS__RUN --name system/packages/install --group scwrypts --type zsh -- --update $@
MAIN() {
SCWRYPTS__RUN --name system/packages/install --group scwrypts --type zsh -- --update $@
}

View File

@ -1,9 +1,7 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
use system/vim/vundle use system/vim/vundle
CHECK_ENVIRONMENT
##################################################################### #####################################################################
EDIT "$VUNDLE__BUILD_DEFINITIONS"
MAIN() {
EDIT "$VUNDLE__BUILD_DEFINITIONS"
}

View File

@ -1,13 +1,8 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
use system/vim/vundle use system/vim/vundle
CHECK_ENVIRONMENT
##################################################################### #####################################################################
PLUGIN_INSTALL() { MAIN() {
[ -d "$HOME/.vim/bundle/Vundle.vim" ] || { [ -d "$HOME/.vim/bundle/Vundle.vim" ] || {
mkdir -p "$HOME/.vim/bundle/" mkdir -p "$HOME/.vim/bundle/"
git clone https://github.com/VundleVim/Vundle.vim.git "$HOME/.vim/bundle/Vundle.vim" git clone https://github.com/VundleVim/Vundle.vim.git "$HOME/.vim/bundle/Vundle.vim"
@ -16,6 +11,3 @@ PLUGIN_INSTALL() {
VUNDLE__PLUGIN_INSTALL || return 1 VUNDLE__PLUGIN_INSTALL || return 1
VUNDLE__REBUILD_PLUGINS || return 2 VUNDLE__REBUILD_PLUGINS || return 2
} }
#####################################################################
PLUGIN_INSTALL $@

View File

@ -1,9 +1,7 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
use system/vim/vundle use system/vim/vundle
CHECK_ENVIRONMENT
##################################################################### #####################################################################
VUNDLE__REBUILD_PLUGINS $@
MAIN() {
VUNDLE__REBUILD_PLUGINS $@
}