#!/bin/bash disconnect() { nmcli con down id "$active" && notify-send "Network Manager" "Disconnected from $active" || notify-send "Network Manager" "Error disconnecting from $active!" } connect() { nmcli con up id "$chosen" && notify-send "Network Manager" "Now connected to $chosen" || notify-send "Network Manager" "Error connecting to $chosen!" } # Get the active vpn connection if there's one active="$(nmcli -g name,type con show --active | grep vpn | sed -e 's#:vpn$##')" # Get the list of vpns mapfile -t list < <(nmcli -g name,type con | grep vpn | sed -e 's#:vpn$##') # A vpn is active if [ -n "$active" ]; then status=" Connected" status_style="#prompt { background-color: @on; }" special="-a 0 -selected-row 1" # Variable passed to rofi options="$active" for i in "${!list[@]}"; do [ "${list[i]}" == "$active" ] && unset "list[i]" || options+="\n${list[i]}" done # No vpn is active else status=" Disconnected" status_style="#prompt { background-color: @off; }" special="" # Variable passed to rofi options="" for i in "${!list[@]}"; do options+="${list[i]}\n" done options=${options::-2} fi chosen=$(echo -e "$options" | rofi -theme ~/.config/rofi/themes/nmvpnmenu.rasi -theme-str "$status_style" -p "$status" -dmenu -i $special) if [ "$chosen" == "$active" ]; then # Disconnect the active vpn disconnect else take_action=false # Check if the chosen option is in the list, to avoid taking action # on the user pressing Escape for example for i in "${!list[@]}"; do [ "${list[i]}" == "$chosen" ] && { take_action=true; break; } done if $take_action; then # A vpn is active if [ -n "$active" ]; then # Disconnect the active vpn disconnect wait sleep 1 # Connect to the chosen one connect # No vpn is active else # Connect to the chosen one connect fi fi fi