test -z "$DISPLAY" || return 0 export PATH="$PATH:$HOME/.local/bin/server" export PROJECTS="$HOME/projects" test -d "$MUSIC" || export MUSIC="/srv/funkwhale/data/music/janek" ## STACKSPIN export STACKSPIN="${STACKSPIN:-$PROJECTS/stackspin}" _stackspin_cluster_cache=/var/tmp/stackspin-cluster # Stackspin CLI Wrapper: # Initialize once with "stack select example.org", # then it loads the last selected cluster on startup. # Presumes a mapping like the following in your ssh config: # Host example.org # Hostname [IP] # This is a function so it can change directory. stack() { local pod_suffix='-\(0\|[0-f]\+\)' test $# -lt 1 && builtin cd "$STACKSPIN" && echo "Usage: $0 [args...]" && echo "Inbuilt commands: select, sso, user, exec, pod, occ, push" && return 1 local command="$1" shift case "$command" in # stackspin administration (select) export _cluster_name="$1" export _cluster_ip="$(ssh -G "$_cluster_name" | grep --max-count 1 "^hostname " | cut -d " " -f2-)" export CLUSTER_DIR="$STACKSPIN/clusters/$_cluster_name" export KUBECONFIG="$CLUSTER_DIR/kube_config_cluster.yml" # Uncomment the line below to always use the main stackspin repo, even when running in a fork. #export GITLAB_CI="true" echo Selected "$_cluster_name" with IP "$_cluster_ip" echo "$_cluster_name" >"$_stackspin_cluster_cache" test "$PWD" = "$HOME" && builtin cd "$STACKSPIN" ;; (sso) builtin cd "$STACKSPIN" "$0" exec dashboard --container backend -- flask "$@";; (users) if test $# -gt 0 then for arg do "$0" user show $arg done else "$0" users $("$0" user list | sed 's|.*<\(.*\)>.*|\1|') fi;; (user|app) if test "$1" = "init" then mail="$2" shift 2 "$0" user create "$mail" "$0" user update "$mail" name "$*" echo "Initialized user '$*' with email '$mail'" else "$0" sso cli "$command" "$@" fi;; (push) git commit -a "$@" git push && flux reconcile source git -n flux-system "$(basename $(git rev-parse --show-toplevel))" flux reconcile kustomization -n flux-system "$(basename $(git rev-parse --show-toplevel))";; # KUBE # app clis (occ) "$0" exec nc-nextcloud -c nextcloud -it -- su www-data -s /bin/bash -c "php $command $*";; (vikunja) local pod=${2:-vikunja} case "$1" in (dump|export) cd $PROJECTS/vikunja "$0" exec "$pod" -c api -- sh -c 'rm -f *.zip && ./vikunja dump >/dev/null && ls --color -lAhF >&2 && cat *.zip' >"$pod-dump_$(date +%F).zip" ;; (restore) "$0" upload "$pod" "$3" -c api "$0" exec "$pod" -c api -it -- ./vikunja restore "$3" ;; (psql) kubectl exec -it -n $("$0" pod "$pod-postgresql") -- sh -c "PGPASSWORD=$(kubectl get secret --namespace stackspout $pod-postgresql -o jsonpath='{.data.postgresql-password}' | base64 --decode) psql -h localhost -U vikunja -p 5432 vikunja" esac ;; # high-level (shell) "$0" exec "$1" -it -- /bin/sh "${@:2}";; (ls) if test $# -gt 1 && ! [[ "$2" =~ ".*/.*" ]] then "$0" exec "$1" "$2" "$3" -it -- ls -lAhF --group-directories-first "${@:4}" else for container in $("$0" kube get "$1" pod -o "jsonpath={.spec.containers[*].name}") do #highlight "Listing content of $container" && "$0" ls "$1" -c "$container" "${@:2}" done fi;; (upload) kubectl cp "$2" -n $("$0" pod "$1$pod_suffix"):$2 "${@:3}" "$0" ls "$1" "${@:3}";; (exec) "$0" kube exec "$@";; (logs) "$0" kube logs "$@" | less -RF;; # low-level (kube) if ! namespacedpod=$("$0" pod "$2$pod_suffix") then echo "No pod found for $2" >&2 return 1 fi local subcommand=$1 shift 2 local commands=() for arg; do case "$arg" in (-*) break;; (*) commands+="$arg"; shift;; esac done test "$subcommand" = get || highlight "Running $subcommand on $namespacedpod" >&2 kubectl "$subcommand" "$commands[@]" -n $(echo $namespacedpod) "$@";; (pod) local podname=$1 shift kubectl get pods --all-namespaces --field-selector="status.phase=Running" -o=custom-columns=S:.metadata.namespace,N:.metadata.name --no-headers "$@" | grep --color=never "$podname";; # stackspin bare (*) if which "$0-$command" >/dev/null 2>&1 then "$0-$command" "$@" return $? fi builtin cd "$STACKSPIN" # Since the install command can also be given bare to install stackspin itself if test $# -gt 0 -a "$command" = install then "./install/install-$1.sh" || ./install/install-app.sh "$@" else python3 -m stackspin "$_cluster_name" "$command" "$@" # pip3 install -r requirements.txt fi;; esac } cat "$_stackspin_cluster_cache" 2>/dev/null | while read cluster; do stack select "$cluster"; done test "$PWD" = "$HOME" && cde "$PROJECTS/ampache-docker"