From 948244ea361d6aacbaa92e2f3e1b8bba03646eae Mon Sep 17 00:00:00 2001 From: Wryn Wagner Date: Wed, 25 Mar 2020 12:43:07 -0600 Subject: [PATCH] Added friendly errors and cleaned up readability --- bin/rd-db.sh | 116 ++++++++++++++++++++++++++++++++++----------------- 1 file changed, 78 insertions(+), 38 deletions(-) diff --git a/bin/rd-db.sh b/bin/rd-db.sh index 652cc4f..4b21700 100755 --- a/bin/rd-db.sh +++ b/bin/rd-db.sh @@ -9,61 +9,101 @@ # `op signin rent-dynamics.1password.com ` # -ERROR_CODE=0; +REQUIREMENT_ERROR="I require %s but it's not installed. (%s)\n\n"; +REQUIREMENT_ERROR_CODE=1; -LINK_OP="https://1password.com/downloads/command-line" -LINK_JQ="https://github.com/stedolan/jq" +LINK_OP="https://1password.com/downloads/command-line"; +LINK_JQ="https://github.com/stedolan/jq"; LINK_FZF="https://github.com/junegunn/fzf"; LINK_MSSQLCLI="https://github.com/dbcli/mssql-cli"; LINK_PGCLI="https://www.pgcli.com/install"; -REQUIREMENT_ERROR="I require %s but it's not installed. (%s)"; +OP_ERROR='\n\n1-password error. Double check password and op-cli configuration\n +Have you run the one-time signin? (`op signin rent-dynamics.1password.com `)\n\n'; +OP_ERROR_CODE=2; + +DB_SELECT_ERROR='No database selected. Exiting.\n\n'; +DB_SELECT_ERROR_CODE=3; + +DB_USER_WARNING='WARNING:No username available for selected connection: (%s)\n\n'; +DB_USER_ERROR='No username supplied. Exiting.'; +DB_USER_ERROR_CODE=4; + +DB_PASSWORD_WARNING='WARNING : No password available for selected connection.'; + +ERROR_CODE=0; command -v op >/dev/null 2>&1\ - || { printf "$REQUIREMENT_ERROR\n\n" 'op' "$LINK_OP" >&2; ERROR_CODE=1; } + || { ERROR_CODE="$REQUIREMENT_ERROR_CODE"; printf "$REQUIREMENT_ERROR" 'op' "$LINK_OP" >&2; } command -v jq >/dev/null 2>&1\ - || { printf "$REQUIREMENT_ERROR\n\n" 'jq' "$LINK_JQ" >&2; ERROR_CODE=1; } + || { ERROR_CODE="$REQUIREMENT_ERROR_CODE"; printf "$REQUIREMENT_ERROR" 'jq' "$LINK_JQ" >&2; } command -v fzf >/dev/null 2>&1\ - || { printf "$REQUIREMENT_ERROR\n\n" 'fzf' "$LINK_FZF" >&2; ERROR_CODE=1; } + || { ERROR_CODE="$REQUIREMENT_ERROR_CODE"; printf "$REQUIREMENT_ERROR" 'fzf' "$LINK_FZF" >&2; } command -v mssql-cli >/dev/null 2>&1\ - || { printf "$REQUIREMENT_ERROR\n\n" 'mssql-cli' "$LINK_MSSQLCLI" >&2; ERROR_CODE=1; } + || { ERROR_CODE="$REQUIREMENT_ERROR_CODE"; printf "$REQUIREMENT_ERROR" 'mssql-cli' "$LINK_MSSQLCLI" >&2; } command -v pgcli >/dev/null 2>&1\ - || { printf "$REQUIREMENT_ERROR\n\n" 'pgcli' "$LINK_PGCLI" >&2; ERROR_CODE=1; } + || { ERROR_CODE="$REQUIREMENT_ERROR_CODE"; printf "$REQUIREMENT_ERROR" 'pgcli' "$LINK_PGCLI" >&2; } + +[[ "$ERROR_CODE" -ne 0 ]] && exit "$ERROR_CODE"; -[[ $ERROR_CODE -ne 0 ]] && exit $ERROR_CODE; +op list templates >/dev/null 2>&1 || { + unset OP_SESSION_rent_dynamics; + eval $(op signin rent_dynamics 2>/dev/null); -echo "getting 1pass session" -if [ -z "$OP_SESSION_rent_dynamics" ]; then - eval $(op signin rent_dynamics) -else - if ! op list templates > /dev/null; then - eval $(op signin rent_dynamics) - fi -fi + op list templates >/dev/null 2>&1 || { printf "$OP_ERROR"; exit "$OP_ERROR_CODE"; }; +} -echo "getting options..." -credentials=$(op get item "$(op list items | jq '.[] | select(.templateUuid == "102") | .overview.title' | sed 's/\"//g' | sort | fzf --height=20% --layout=reverse)" |jq '.details.sections[0].fields[] | {(.t) : .v }' | jq -s 'add | (.type, if .url then .url else .server end, .username, .password, .database)') -database_type=$(echo $credentials | awk '{print $1;}' | xargs) -server=$(echo $credentials | awk '{print $2;}' | xargs) -user=$(echo $credentials | awk '{print $3;}' | xargs) -pass=$(echo $credentials | awk '{print $4;}' | xargs) +printf "\n\nSelect database connection:" +connection=$(\ + op list items 2>/dev/null \ + | jq '.[] | select(.templateUuid == "102") | .overview.title' \ + | sed 's/\"//g' \ + | sort \ + | fzf --height=20% --layout=reverse \ +); -if [ $database_type == "mssql" ]; then - echo "microsoft sql database detected, connecting with mssql-cli" - mssql-cli -S $server -U $user -P $pass -elif [ $database_type == "postgresql" ]; then - echo "postgres database detected, connecting with pgcli" - dbname=$(echo $credentials | awk '{print $5;}' | xargs) - PGPASSWORD=$pass pgcli -h $server -U $user -d $dbname +credentials=$(\ + op get item "$connection" 2>/dev/null \ + | jq '.details.sections[0].fields[] | {(.t) : .v }' \ + | jq -s 'add | (.type, if .url then .url else .server end, .username, .password, .database)' \ +); + +database_type=$(echo "$credentials" | awk '{print $1;}' | xargs) +server=$(echo "$credentials" | awk '{print $2;}' | xargs) +user=$(echo "$credentials" | awk '{print $3;}' | xargs) +pass=$(echo "$credentials" | awk '{print $4;}' | xargs) +dbname=$(echo "$credentials" | awk '{print $5;}' | xargs) + +[ "$server" == 'null' ] && { printf "$DB_SELECT_ERROR"; exit "$DB_SELECT_ERROR_CODE"; }; + +[ "$user" == 'null' ] && { + printf "$DB_USER_WARNING" "$connection"; + printf "Enter username:"; + read user; + + [ ! "$user" ] && { echo "$DB_USER_ERROR"; exit "$DB_USER_ERROR_CODE";} +}; + +[ "$pass" == 'null' ] && { + printf "$DB_PASSWORD_WARNING"; + printf "Enter password (%s::%s):" "$connection" "$user"; + read pass; +}; + +if [ "$database_type" == "mssql" ]; then + echo "Microsoft SQL database detected! Connecting..." + mssql-cli -S "$server" -U "$user" -P "$pass" +elif [ "$database_type" == "postgresql" ]; then + echo "Postgres database detected! Connecting..." + PGPASSWORD="$pass" pgcli -h "$server" -U "$user" -d "$dbname" else database_type=$(echo -e "mssql\npostgresql" | fzf --height=20% --layout=reverse) - if [ $database_type == "mssql" ]; then - echo "microsoft sql database chosen, connecting with mssql-cli" - mssql-cli -S $server -U $user -P $pass - elif [ $database_type == "postgresql" ]; then - echo "postgres database chosen, connecting with pgcli" - dbname=$(echo $credentials | awk '{print $5;}' | xargs) - PGPASSWORD=$pass pgcli -h $server -U $user -d $dbname + if [ "$database_type" == "mssql" ]; then + echo "Connection type selected: Microsoft SQL. Connecting..."; + mssql-cli -S "$server" -U "$user" -P "$pass" + elif [ "$database_type" == "postgresql" ]; then + echo "Connection type selected: Postgres. Connecting..."; + PGPASSWORD="$pass" pgcli -h "$server" -U "$user" -d "$dbname" fi fi