diff --git a/bash/.bash_aliases b/bash/.bash_aliases index 98fe0e5..21b9a7a 100644 --- a/bash/.bash_aliases +++ b/bash/.bash_aliases @@ -74,3 +74,12 @@ alias folders="find . -maxdepth 1 -type d -print | xargs du -sk | sort -rn" # Show all disks, partitions with sizes alias lds='sudo lsblk -o NAME,FSTYPE,SIZE,MOUNTPOINT,LABEL' + +alias ltd='docker exec -it lt-dev /bin/bash' +alias lt-dd-cms='lt-dd project:execute -p mpm-cms -n -- ' +alias lt-dd-web='lt-dd project:execute -p mpm-website -n -- ' +alias lt-dd-w2='lt-dd project:execute -p wrqr2 -n -- ' +alias gcp='git cherry-pick' +alias fm='xinput set-prop 9 "libinput Scroll Method Enabled" 0, 0, 1 && xinput set-prop 9 "libinput Button Scrolling Button" 10' + +alias gdq='screen -d -m streamlink https://www.twitch.tv/gamesdonequick best -p mpv' diff --git a/bash/.bashrc b/bash/.bashrc index b9ae721..46648b5 100644 --- a/bash/.bashrc +++ b/bash/.bashrc @@ -11,16 +11,16 @@ esac # don't put duplicate lines or lines starting with space in the history. # See bash(1) for more options -HISTCONTROL=ignoreboth +#HISTCONTROL=ignoreboth +HISTCONTROL=erasedups # append to the history file, don't overwrite it -shopt -s histappend +#shopt -s histappend #C for setting history length see HISTSIZE and HISTFILESIZE in bash(1) HISTSIZE=10000 HISTFILESIZE=20000 -#bla # check the window size after each command and, if necessary, # update the values of LINES and COLUMNS. shopt -s checkwinsize @@ -97,7 +97,7 @@ if [ "$color_prompt" = yes ]; then # PS1FRONT="$HC$FMAG[ $FGRN${debian_chroot:+($debian_chroot)}\u$FYEL@$FGRN\h$FYEL: $FBLE\w" # # PS1FRONT="$FMAG[ $FGRN\u$FYEL@$FGRN\h$FYEL" # PS1FRONT="$FMAG[ $FBLK$BGRN$FBLK \u $FGRN$BBLK$FBLK$BYEL$FBLK \h $FYEL$BBLK$FBLK$BBLE$FBLK \w $FBLE$BBLK " - if [ "$LC_PUTTY_FONT" = "powerline" ]; then + if [ "$LC_PUTTY_FONT" = "powerline" ] || [ "$XDG_CURRENT_DESKTOP" = "KDE" ]; then PS1FRONT="$FBLK$BGRN$FBLK \h $FGRN$BYEL$FBLK \u $FYEL$BBLE$FBLK ${PYTHON_VIRTUALENV}\w $BBLK" PS1BACK="$FBLE$BBLK $RS" else @@ -170,3 +170,22 @@ if ! shopt -oq posix; then . /etc/bash_completion fi fi + +export PATH="$HOME/LetsTalk/projects/devdocker/bin:$PATH" +export PATH="$HOME/.local/bin:$PATH" + +KUBECONFIG="" +for kubeconfig in $HOME/.kube/config*; do + if [ -z $KUBECONFIG ] + then + KUBECONFIG=$kubeconfig + else + KUBECONFIG=$KUBECONFIG:$kubeconfig + fi +done +export KUBECONFIG + + + +#kubectx and kubens +export PATH=~/.kubectx:$PATH diff --git a/bin/bin/fixallperm.sh b/bin/bin/fixallperm.sh new file mode 100755 index 0000000..f724982 --- /dev/null +++ b/bin/bin/fixallperm.sh @@ -0,0 +1,7 @@ +#/bin/sh + +for D in `find ~/LetsTalk/projects/ -maxdepth 1 -mindepth 1 -printf '%f\n' -type d` +do + echo "Fixing permissions of: ${D}" + lt-dd project:fixpermissions -n -p "${D}" +done diff --git a/bin/bin/kubectx b/bin/bin/kubectx new file mode 100755 index 0000000..f00cece --- /dev/null +++ b/bin/bin/kubectx @@ -0,0 +1,238 @@ +#!/usr/bin/env bash +# +# kubectx(1) is a utility to manage and switch between kubectl contexts. + +# Copyright 2017 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +[[ -n $DEBUG ]] && set -x + +set -eou pipefail +IFS=$'\n\t' + +SELF_CMD="$0" +SELF="kubectx" +if [[ "$(basename "$0")" == kubectl-* ]]; then # invoked as plugin + SELF="kubectl ctx" +fi + +KUBECTX="${XDG_CACHE_HOME:-$HOME/.kube}/kubectx" + +usage() { + cat < : switch to context + $SELF - : switch to the previous context + $SELF -c, --current : show the current context name + $SELF = : rename context to + $SELF =. : rename current-context to + $SELF -d [] : delete context ('.' for current-context) + (this command won't delete the user/cluster entry + that is used by the context) + + $SELF -h,--help : show this message +EOF +} + +exit_err() { + echo >&2 "${1}" + exit 1 +} + +current_context() { + $KUBECTL config view -o=jsonpath='{.current-context}' +} + +get_contexts() { + $KUBECTL config get-contexts -o=name | sort -n +} + +list_contexts() { + set -u pipefail + local cur ctx_list + cur="$(current_context)" || exit_err "error getting current context" + ctx_list=$(get_contexts) || exit_err "error getting context list" + + local yellow darkbg normal + yellow=$(tput setaf 3 || true) + darkbg=$(tput setab 0 || true) + normal=$(tput sgr0 || true) + + local cur_ctx_fg cur_ctx_bg + cur_ctx_fg=${KUBECTX_CURRENT_FGCOLOR:-$yellow} + cur_ctx_bg=${KUBECTX_CURRENT_BGCOLOR:-$darkbg} + + for c in $ctx_list; do + if [[ -n "${_KUBECTX_FORCE_COLOR:-}" || \ + -t 1 && -z "${NO_COLOR:-}" ]]; then + # colored output mode + if [[ "${c}" = "${cur}" ]]; then + echo "${cur_ctx_bg}${cur_ctx_fg}${c}${normal}" + else + echo "${c}" + fi + else + echo "${c}" + fi + done +} + +read_context() { + if [[ -f "${KUBECTX}" ]]; then + cat "${KUBECTX}" + fi +} + +save_context() { + local saved + saved="$(read_context)" + + if [[ "${saved}" != "${1}" ]]; then + printf %s "${1}" > "${KUBECTX}" + fi +} + +switch_context() { + $KUBECTL config use-context "${1}" +} + +choose_context_interactive() { + local choice + choice="$(_KUBECTX_FORCE_COLOR=1 \ + FZF_DEFAULT_COMMAND="${SELF_CMD}" \ + fzf --ansi --no-preview || true)" + if [[ -z "${choice}" ]]; then + echo 2>&1 "error: you did not choose any of the options" + exit 1 + else + set_context "${choice}" + fi +} + +set_context() { + local prev + prev="$(current_context)" || exit_err "error getting current context" + + switch_context "${1}" + + if [[ "${prev}" != "${1}" ]]; then + save_context "${prev}" + fi +} + +swap_context() { + local ctx + ctx="$(read_context)" + if [[ -z "${ctx}" ]]; then + echo "error: No previous context found." >&2 + exit 1 + fi + set_context "${ctx}" +} + +context_exists() { + grep -q ^"${1}"\$ <($KUBECTL config get-contexts -o=name) +} + +rename_context() { + local old_name="${1}" + local new_name="${2}" + + if [[ "${old_name}" == "." ]]; then + old_name="$(current_context)" + fi + + if ! context_exists "${old_name}"; then + echo "error: Context \"${old_name}\" not found, can't rename it." >&2 + exit 1 + fi + + if context_exists "${new_name}"; then + echo "Context \"${new_name}\" exists, deleting..." >&2 + $KUBECTL config delete-context "${new_name}" 1>/dev/null 2>&1 + fi + + $KUBECTL config rename-context "${old_name}" "${new_name}" +} + +delete_contexts() { + for i in "${@}"; do + delete_context "${i}" + done +} + +delete_context() { + local ctx + ctx="${1}" + if [[ "${ctx}" == "." ]]; then + ctx="$(current_context)" || exit_err "error getting current context" + fi + echo "Deleting context \"${ctx}\"..." >&2 + $KUBECTL config delete-context "${ctx}" +} + +main() { + if hash kubectl 2>/dev/null; then + KUBECTL=kubectl + elif hash kubectl.exe 2>/dev/null; then + KUBECTL=kubectl.exe + else + echo >&2 "kubectl is not installed" + exit 1 + fi + + if [[ "$#" -eq 0 ]]; then + if [[ -t 1 && -z "${KUBECTX_IGNORE_FZF:-}" && "$(type fzf &>/dev/null; echo $?)" -eq 0 ]]; then + choose_context_interactive + else + list_contexts + fi + elif [[ "${1}" == "-d" ]]; then + if [[ "$#" -lt 2 ]]; then + echo "error: missing context NAME" >&2 + usage + exit 1 + fi + delete_contexts "${@:2}" + elif [[ "$#" -gt 1 ]]; then + echo "error: too many arguments" >&2 + usage + exit 1 + elif [[ "$#" -eq 1 ]]; then + if [[ "${1}" == "-" ]]; then + swap_context + elif [[ "${1}" == '-c' || "${1}" == '--current' ]]; then + # we don't call current_context here for two reasons: + # - it does not fail when current-context property is not set + # - it does not return a trailing newline + kubectl config current-context + elif [[ "${1}" == '-h' || "${1}" == '--help' ]]; then + usage + elif [[ "${1}" =~ ^-(.*) ]]; then + echo "error: unrecognized flag \"${1}\"" >&2 + usage + exit 1 + elif [[ "${1}" =~ (.+)=(.+) ]]; then + rename_context "${BASH_REMATCH[2]}" "${BASH_REMATCH[1]}" + else + set_context "${1}" + fi + else + usage + exit 1 + fi +} + +main "$@" diff --git a/bin/bin/kubens b/bin/bin/kubens new file mode 100755 index 0000000..8ca7eba --- /dev/null +++ b/bin/bin/kubens @@ -0,0 +1,224 @@ +#!/usr/bin/env bash +# +# kubens(1) is a utility to switch between Kubernetes namespaces. + +# Copyright 2017 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +[[ -n $DEBUG ]] && set -x + +set -eou pipefail +IFS=$'\n\t' + +SELF_CMD="$0" +SELF="kubens" +if [[ "$(basename "$0")" == kubectl-* ]]; then # invoked as plugin + SELF="kubectl ns" +fi + +KUBENS_DIR="${XDG_CACHE_HOME:-$HOME/.kube}/kubens" + +usage() { + cat < : change the active namespace of current context + $SELF - : switch to the previous namespace in this context + $SELF -c, --current : show the current namespace + $SELF -h,--help : show this message +EOF +} + +exit_err() { + echo >&2 "${1}" + exit 1 +} + +current_namespace() { + local cur_ctx + + cur_ctx="$(current_context)" || exit_err "error getting current context" + ns="$($KUBECTL config view -o=jsonpath="{.contexts[?(@.name==\"${cur_ctx}\")].context.namespace}")" \ + || exit_err "error getting current namespace" + + if [[ -z "${ns}" ]]; then + echo "default" + else + echo "${ns}" + fi +} + +current_context() { + $KUBECTL config current-context +} + +get_namespaces() { + $KUBECTL get namespaces -o=jsonpath='{range .items[*].metadata.name}{@}{"\n"}{end}' +} + +escape_context_name() { + echo "${1//\//-}" +} + +namespace_file() { + local ctx + + ctx="$(escape_context_name "${1}")" + echo "${KUBENS_DIR}/${ctx}" +} + +read_namespace() { + local f + f="$(namespace_file "${1}")" + [[ -f "${f}" ]] && cat "${f}" + return 0 +} + +save_namespace() { + mkdir -p "${KUBENS_DIR}" + local f saved + f="$(namespace_file "${1}")" + saved="$(read_namespace "${1}")" + + if [[ "${saved}" != "${2}" ]]; then + printf %s "${2}" > "${f}" + fi +} + +switch_namespace() { + local ctx="${1}" + $KUBECTL config set-context "${ctx}" --namespace="${2}" + echo "Active namespace is \"${2}\".">&2 +} + +choose_namespace_interactive() { + # directly calling kubens via fzf might fail with a cryptic error like + # "$FZF_DEFAULT_COMMAND failed", so try to see if we can list namespaces + # locally first + if [[ -z "$(list_namespaces)" ]]; then + echo >&2 "error: could not list namespaces (is the cluster accessible?)" + exit 1 + fi + + local choice + choice="$(_KUBECTX_FORCE_COLOR=1 \ + FZF_DEFAULT_COMMAND="${SELF_CMD}" \ + fzf --ansi --no-preview || true)" + if [[ -z "${choice}" ]]; then + echo 2>&1 "error: you did not choose any of the options" + exit 1 + else + set_namespace "${choice}" + fi +} + +set_namespace() { + local ctx prev + ctx="$(current_context)" || exit_err "error getting current context" + prev="$(current_namespace)" || exit_error "error getting current namespace" + + if grep -q ^"${1}"\$ <(get_namespaces); then + switch_namespace "${ctx}" "${1}" + + if [[ "${prev}" != "${1}" ]]; then + save_namespace "${ctx}" "${prev}" + fi + else + echo "error: no namespace exists with name \"${1}\".">&2 + exit 1 + fi +} + +list_namespaces() { + local yellow darkbg normal + yellow=$(tput setaf 3 || true) + darkbg=$(tput setab 0 || true) + normal=$(tput sgr0 || true) + + local cur_ctx_fg cur_ctx_bg + cur_ctx_fg=${KUBECTX_CURRENT_FGCOLOR:-$yellow} + cur_ctx_bg=${KUBECTX_CURRENT_BGCOLOR:-$darkbg} + + local cur ns_list + cur="$(current_namespace)" || exit_err "error getting current namespace" + ns_list=$(get_namespaces) || exit_err "error getting namespace list" + + for c in $ns_list; do + if [[ -n "${_KUBECTX_FORCE_COLOR:-}" || \ + -t 1 && -z "${NO_COLOR:-}" ]]; then + # colored output mode + if [[ "${c}" = "${cur}" ]]; then + echo "${cur_ctx_bg}${cur_ctx_fg}${c}${normal}" + else + echo "${c}" + fi + else + echo "${c}" + fi + done +} + +swap_namespace() { + local ctx ns + ctx="$(current_context)" || exit_err "error getting current context" + ns="$(read_namespace "${ctx}")" + if [[ -z "${ns}" ]]; then + echo "error: No previous namespace found for current context." >&2 + exit 1 + fi + set_namespace "${ns}" +} + +main() { + if [[ -z "${KUBECTL:-}" ]]; then + if hash kubectl 2>/dev/null; then + KUBECTL=kubectl + elif hash kubectl.exe 2>/dev/null; then + KUBECTL=kubectl.exe + else + echo >&2 "kubectl is not installed" + exit 1 + fi + fi + + if [[ "$#" -eq 0 ]]; then + if [[ -t 1 && -z ${KUBECTX_IGNORE_FZF:-} && "$(type fzf &>/dev/null; echo $?)" -eq 0 ]]; then + choose_namespace_interactive + else + list_namespaces + fi + elif [[ "$#" -eq 1 ]]; then + if [[ "${1}" == '-h' || "${1}" == '--help' ]]; then + usage + elif [[ "${1}" == "-" ]]; then + swap_namespace + elif [[ "${1}" == '-c' || "${1}" == '--current' ]]; then + current_namespace + elif [[ "${1}" =~ ^-(.*) ]]; then + echo "error: unrecognized flag \"${1}\"" >&2 + usage + exit 1 + elif [[ "${1}" =~ (.+)=(.+) ]]; then + alias_context "${BASH_REMATCH[2]}" "${BASH_REMATCH[1]}" + else + set_namespace "${1}" + fi + else + echo "error: too many flags" >&2 + usage + exit 1 + fi +} + +main "$@"