solorice/config/waybar/scripts/wireguard.sh
Kristofers Solo a42ded1119 Use dotter
2024-08-28 09:02:07 +03:00

166 lines
3.6 KiB
Bash

#!/usr/bin/env bash
# nmcli WireGuard abstraction layer for use with my waybar module and rofi custom menu script
#
# requires nmcli on your path
# install to the same directory as wireguard-rofi.sh
#
# usage: ./wireguard.sh [short|menu|toggle NAME]
# no argument: print current connections
# short: print current connections in short format
# menu: print all connections
# toggle NAME: toggle connection NAME
if ! command -v nmcli >/dev/null 2>&1; then
echo "ERROR: 'nmcli' not found"
echo "This tool is a 'nmcli' frontend, hence you should install NetworkManager before trying to use it."
exit 1
fi
nargs=$#
get="no"
showmenu="no"
short="no"
dotoggle="no"
if [[ $nargs == 0 ]]
then
get="yes"
elif [[ $nargs == 1 ]]
then
if [[ $1 == "menu" ]]
then
showmenu="yes"
elif [[ $1 == "short" ]]
then
if ! command -v sed >/dev/null 2>&1; then
echo "ERROR: 'sed' not found"
echo "Please install 'sed' to enable the 'short' option."
exit 1
fi
get="yes"
short="short"
fi
elif [[ $nargs == 2 ]]
then
if [[ $1 == "toggle" ]]
then
dotoggle="yes"
conn="$2"
fi
fi
nmclicmd="nmcli connection"
wgconns="$nmclicmd show"
wgactive="$wgconns --active"
connected=()
available=()
function get_conns {
while read -r name uuid type device
do
if [[ $type != "wireguard" ]]
then
continue
fi
if [[ $device != "--" ]]
then
while read -r key value
do
if [[ $key != "ipv4.addresses:" ]]
then
continue
fi
connected+=("$name: $value")
done < <($wgconns $name)
else
available+=("$name")
fi
done < <($1)
}
function print_conns {
local first="yes"
local array_print="$1[@]"
local array_print=("${!array_print}")
local text=""
local tooltip=""
if [ "${#array_print[@]}" -le 0 ]
then
return
fi
if [[ "$2" == "list" ]]
then
for c in "${array_print[@]}"
do
echo "$1: $c"
done
else
for c in "${array_print[@]}"
do
if [[ "$first" != "yes" ]]
then
text="$text | "
tooltip="$tooltip\n"
fi
if [[ "$2" == "short" ]]
then
text="$text$(echo -n $c | sed -E 's/^(.+): ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\/[0-9]+)$/\1/')"
else
text="$text$c"
fi
tooltip="$tooltip$c"
first="no"
done
echo "{\"text\": \"$text\", \"tooltip\": \"$tooltip\"}"
fi
}
function array_contains {
local array_has="$1[@]"
local array_has=("${!array_has}")
local element="$2"
for e in "${array_has[@]}"
do
if [[ "$e" == *"$element"* ]]
then
echo "yes"
return
fi
done
echo "no"
}
if [[ $get == "yes" ]]
then
get_conns "$wgactive"
print_conns connected "$short"
elif [[ $showmenu == "yes" ]]
then
get_conns "$wgconns"
print_conns connected "list"
print_conns available "list"
elif [[ $dotoggle == "yes" ]]
then
get_conns "$wgconns"
if [[ "$(array_contains connected $conn)" == "yes" ]]
then
$nmclicmd down "$conn"
elif [[ "$(array_contains available $conn)" == "yes" ]]
then
$nmclicmd up "$conn"
else
echo "err: connection not found"
exit 1
fi
else
echo "err: wrong args"
exit 1
fi