diff options
Diffstat (limited to 'wide_jump.sh')
-rwxr-xr-x | wide_jump.sh | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/wide_jump.sh b/wide_jump.sh new file mode 100755 index 0000000..a5f6ca6 --- /dev/null +++ b/wide_jump.sh @@ -0,0 +1,144 @@ +#!/bin/bash + +# the first wide name that actually makes sense + +# IMPLEMENT CACHE +# TEST TO SEE IF SORTING FUCKS SHIT UP +# A LOTTA ERROR HANDLING, ESPECIALLY BEFORE THE CONNECT +# SWITCH PROTOCOLS TO CASE STATEMENT +# TEST MULTIPLE RDP CONNECTIONS AT THE SAME TIME + +# set -e +export TERM=rxvt-unicode + +CMD_RDP=( remmina --no-tray-icon -c ) +CMD_SSH=( ssh ) +CMD_NEW_TERMINAL=( urxvt -e bash -rcfile "$HOME/.bashrc.JUMP" ) + +FZF_FLAGS="--cycle --layout=reverse --border=double --ansi --color=fg:white,bg:black,bg+:magenta,hl:yellow,hl+:green,fg+:white,border:blue,info:green,prompt:green" +SPAWN_NEW_TERMINAL=0 +RE_CACHE=0 + +while [ $# -gt 0 ]; do + case $1 in + -h | --help) + echo -e "usage: $0 [-h help] [--spawn-new-terminal] [--regenerate-cache]" + exit 0 + ;; + --spawn-new-terminal) + SPAWN_NEW_TERMINAL=1 + ;; + --regenerate-cache) + RE_CACHE=1 + ;; + *) + echo "Invalid option: $1" >&2 + echo -e "usage: $0 [-h help] [--spawn-new-terminal] [--regenerate-cache]" + exit 1 + ;; + esac + + shift +done + + +CACHE="/tmp/serverlist.txt" + +declare CMD="" +declare SERVER="" +declare SERVER_ITEM="" +declare SERVER_ADDRESS="" +declare SERVER_NAME="" +declare -a server_list=() + + +function cache_list () { + + [[ -s "${CACHE}.tmp" ]] && truncate -s 0 $CACHE + + item_list=$( pass grep "^connection_address:" | grep ":$" | sed -r "s|(\\x1b)?\\[[0-9;]*m||g; s|:$||g" | sort ) + + for item in ${item_list[@]}; do + name=$( get_from_pass "$item" "connection_name" ) + address=$( get_from_pass "$item" "connection_address" ) + echo "${item} ===> ${address} (${name})" >> "${CACHE}.tmp" + done + + cat "${CACHE}.tmp" | column -t | sed 's/\( *\) /\1/g' > $CACHE + rm -f "${CACHE}.tmp" +} + +function get_from_pass () { + pass show "$1" | grep "^$2:" | sed -r "s|^$2: ||g" +} + +[[ -s $CACHE && $RE_CACHE -eq 0 ]] || cache_list +mapfile -t server_list < $CACHE + +# pick server + +SERVER=$( printf '%s\n' "${server_list[@]}" | fzf $FZF_FLAGS ) +[[ -z $SERVER ]] && echo "Error: No server selected. Exiting..." >&2 && exit -2 +SERVER_ITEM=$( echo "$SERVER" | sed -r "s|^([^ ]*)\s+===>\s+([^ ]*)\s+\(([^ ]*)\)$|\1|g" ) +SERVER_ADDRESS=$( echo "$SERVER" | sed -r "s|^([^ ]*)\s+===>\s+([^ ]*)\s+\(([^ ]*)\)$|\2|g" ) +SERVER_NAME=$( echo "$SERVER" | sed -r "s|^([^ ]*)\s+===>\s+([^ ]*)\s+\(([^ ]*)\)$|\3|g" ) + + +# connect to server based on protocol + +SERVER_CONNECTION_TYPE=$( get_from_pass "$SERVER_ITEM" "connection_type" ) + +if [[ $SERVER_CONNECTION_TYPE == "SSH" ]]; then + + CMD=$CMD_SSH + + PAM_LOGIN_ACCOUNT=$( get_from_pass "$SERVER_ITEM" "PAM_username" ) + SERVER_CONNECTION_PAM_ACCESS_ACCOUNT=$( get_from_pass "$SERVER_ITEM" "connection_PAM_username" ) + [[ -n $PAM_LOGIN_ACCOUNT && -n $SERVER_CONNECTION_PAM_ACCESS_ACCOUNT ]] && CMD+=( -l "${PAM_LOGIN_ACCOUNT}#${SERVER_CONNECTION_PAM_ACCESS_ACCOUNT}" ) + + SERVER_CONNECTION_USER=$( get_from_pass "$SERVER_ITEM" "connection_username" ) + [[ -n $SERVER_CONNECTION_USER ]] && CMD+=( -l "$SERVER_CONNECTION_USER" ) + + [[ -n $PAM_LOGIN_ACCOUNT && -n $SERVER_CONNECTION_PAM_ACCESS_ACCOUNT && -n $SERVER_CONNECTION_USER ]] && echo "ERROR: Multiple login methods detected. Please edit the password item to contain only one" && exit -2 + + SERVER_CONNECTION_KEYPATH=$( get_from_pass "$SERVER_ITEM" "connection_key_path" ) + [[ -n $SERVER_CONNECTION_KEYPATH ]] && CMD+=( -i "$SERVER_CONNECTION_KEYPATH" ) + + SERVER_CONNECTION_PORT=$( get_from_pass "$SERVER_ITEM" "connection_port" ) + [[ -z "$SERVER_CONNECTION_PORT" ]] && SERVER_CONNECTION_PORT=22 + CMD+=( -p "$SERVER_CONNECTION_PORT" ) + + [[ -n $PAM_LOGIN_ACCOUNT && -n $SERVER_CONNECTION_PAM_ACCESS_ACCOUNT && -n $SERVER_CONNECTION_USER ]] + + + CMD+=( "$SERVER_ADDRESS" ) + +elif [[ $SERVER_CONNECTION_TYPE == "RDP" ]]; then + + CMD=$CMD_RDP + + SERVER_CONNECTION_PORT=$( get_from_pass "$SERVER_ITEM" "connection_port" ) + [[ -z "$SERVER_CONNECTION_PORT" ]] && SERVER_CONNECTION_PORT=3389 + + + SERVER_CONNECTION_USER=$( get_from_pass "$SERVER_ITEM" "connection_username" ) + SERVER_CONNECTION_DOMAIN=$( get_from_pass "$SERVER_ITEM" "connection_domain" ) + [[ -n "$SERVER_CONNECTION_DOMAIN" ]] && SERVER_CONNECTION_USER="${SERVER_CONNECTION_DOMAIN}\\${SERVER_CONNECTION_USER}" + + SERVER_CONNECTION_ENCRYPTED_PASSWORD="$( pass show "$SERVER_ITEM" | head -n1 | remmina --encrypt-password --no-tray-icon 2>/dev/null | grep "^Encrypted password: " | sed -r "s|^Encrypted password: ||g" )" + + CMD+=( "rdp://${SERVER_CONNECTION_USER}:${SERVER_CONNECTION_ENCRYPTED_PASSWORD}@${SERVER_ADDRESS}:${SERVER_CONNECTION_PORT}" ) +else + exit -1 +fi + +echo ${CMD[*]} + +if [[ $SPAWN_NEW_TERMINAL -eq 1 ]]; then + cat "$HOME/.bashrc" > "$HOME/.bashrc.JUMP" + echo "export TERM=$TERM" >> "$HOME/.bashrc.JUMP" + echo ${CMD[*]} >> "$HOME/.bashrc.JUMP" + pass -c "$SERVER_ITEM" && "${CMD_NEW_TERMINAL[@]}" 2>/dev/null +else + pass -c "$SERVER_ITEM" && "${CMD[@]}" +fi |