blob: a5f6ca6a6cb6642fba0722fe4a34c1f1a8886b8f (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
|