summaryrefslogtreecommitdiff
path: root/wide_jump.sh
diff options
context:
space:
mode:
Diffstat (limited to 'wide_jump.sh')
-rwxr-xr-xwide_jump.sh144
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