summaryrefslogtreecommitdiff
path: root/wide_jump.sh
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