diff --git a/plugins/vault-switch/README.md b/plugins/vault-switch/README.md new file mode 100644 index 000000000..7dd07f82d --- /dev/null +++ b/plugins/vault-switch/README.md @@ -0,0 +1,29 @@ +# Vault-switch plugin + +## Description + +This plugin can switch among nodes of Vault - HashiCorp + +## Configuration + +For using a plugin you should add VAULT_NODES to **~/.zshrc** +Variable **VAULT_NODES** must look as + +```bash +VAULT_NODES="node1,https://vault1.example.com,secret_token1;node2,https://vault2.example.com,secret_token2" +``` + +If you want to skip verify checking of ssl then add true to end of the string. + +```bash +VAULT_NODES="node1,https://vault1.example.com,secret_token1,true;node2,https://vault2.example.com,secret_token2" +``` + +Name of a node, address, token are separating comma. Other nodes separate semicolon. +After need to add the name of the plugin to **~/.zshrc** to variable **plugins=(vault-switch)** + +**Example usage:** + +![vault-switch](example.png) + +State of restoring stored in **~/.vault-switch/credentials** diff --git a/plugins/vault-switch/example.png b/plugins/vault-switch/example.png new file mode 100644 index 000000000..055b8e534 Binary files /dev/null and b/plugins/vault-switch/example.png differ diff --git a/plugins/vault-switch/vault-switch.plugin.zsh b/plugins/vault-switch/vault-switch.plugin.zsh new file mode 100644 index 000000000..ca3127f25 --- /dev/null +++ b/plugins/vault-switch/vault-switch.plugin.zsh @@ -0,0 +1,57 @@ +autoload -U add-zsh-hook +add-zsh-hook precmd _restore_cache + +FILE_CREDENTIALS="${HOME}/.vault-switch/credentials" + +function _restore_cache(){ + [ ! -d ${HOME}/.vault-switch ] && mkdir -p ${HOME}/.vault-switch + [ ! -f $FILE_CREDENTIALS ] && touch ${FILE_CREDENTIALS} + source ${FILE_CREDENTIALS} +} + +function _get-nodes(){ + IFS=";" read -A NODES <<< ${VAULT_NODES} +} + +function _set-color(){ + echo "\e[1;32m$1\e[0m" +} + +function _list-nodes(){ + INDEX=1 + for i in ${NODES[@]} + do + NODE=$(echo $i | cut -d "," -f 1) + [[ "${NODE}" == "${VAULT_SELECT_NODE}" ]] && ASTERISK="*" + echo "${INDEX}) ${NODE} $(_set-color ${ASTERISK})" + INDEX=$[$INDEX+1] + unset ASTERISK + done +} + +function _set-work-node(){ + if [ $1 -gt ${#NODES[@]} ] + then + echo "Number of node not found" + else + VAULT_SELECT_NODE=$(echo ${NODES[$1]} | cut -d "," -f 1) + VAULT_ADDR=$(echo ${NODES[$1]} | cut -d "," -f 2) + VAULT_TOKEN=$(echo ${NODES[$1]} | cut -d "," -f 3) + VAULT_SKIP_VERIFY=$(echo ${NODES[$1]} | cut -d "," -f 4) + + echo > ${FILE_CREDENTIALS} + echo "export VAULT_SELECT_NODE=${VAULT_SELECT_NODE}" >> ${FILE_CREDENTIALS} + echo "export VAULT_ADDR=${VAULT_ADDR}" >> ${FILE_CREDENTIALS} + echo "export VAULT_TOKEN=${VAULT_TOKEN}" >> ${FILE_CREDENTIALS} + [[ $VAULT_SKIP_VERIFY ]] && echo "export VAULT_SKIP_VERIFY=true" >> ${FILE_CREDENTIALS} + + _list-nodes + fi + +} + +function vault-switch() { + _get-nodes + [ ! $1 ] && _list-nodes + [ $1 ] && _set-work-node $1 +}