127 lines
3.8 KiB
Bash
Executable File
127 lines
3.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
# Author: Jesse Mirabel (@sejjy)
|
|
# GitHub: https://github.com/sejjy/mechabar
|
|
|
|
# Rofi config
|
|
config="$HOME/.config/rofi/wifi-menu.rasi"
|
|
|
|
options=$(
|
|
echo "Manual Entry"
|
|
echo "Disable Wi-Fi"
|
|
)
|
|
option_disabled="Enable Wi-Fi"
|
|
|
|
# Rofi window override
|
|
override_ssid="entry { placeholder: \"Enter SSID\"; } listview { enabled: false; }"
|
|
override_password="entry { placeholder: \"Enter password\"; } listview { enabled: false; }"
|
|
override_disabled="mainbox { children: [ listview ]; } listview { lines: 1; padding: 6px; }"
|
|
|
|
# Prompt for password
|
|
get_password() {
|
|
rofi -dmenu -password -config "${config}" -theme-str "${override_password}" -p " " || pkill -x rofi
|
|
}
|
|
|
|
while true; do
|
|
wifi_list() {
|
|
nmcli --fields "SECURITY,SSID" device wifi list |
|
|
tail -n +2 | # Skip the header line from nmcli output
|
|
sed 's/ */ /g' | # Replace multiple spaces with a single space
|
|
sed -E "s/WPA*.?\S/ /g" | # Replace 'WPA*' with a Wi-Fi lock icon
|
|
sed "s/^--/ /g" | # Replace '--' (open networks) with an open Wi-Fi icon
|
|
sed "s/ //g" | # Remove duplicate Wi-Fi lock icons
|
|
sed "/--/d" | # Remove lines containing '--' (empty SSIDs)
|
|
awk '!seen[$0]++' # Filter out duplicate SSIDs
|
|
}
|
|
|
|
# Get Wi-Fi status
|
|
wifi_status=$(nmcli -fields WIFI g)
|
|
|
|
case "$wifi_status" in
|
|
*"enabled"*)
|
|
selected_option=$(echo "$options"$'\n'"$(wifi_list)" |
|
|
rofi -dmenu -i -selected-row 1 -config "${config}" -p " " || pkill -x rofi)
|
|
;;
|
|
*"disabled"*)
|
|
selected_option=$(echo "$option_disabled" |
|
|
rofi -dmenu -i -config "${config}" -theme-str "${override_disabled}" || pkill -x rofi)
|
|
;;
|
|
esac
|
|
|
|
# Extract selected SSID
|
|
read -r selected_ssid <<<"${selected_option:3}"
|
|
|
|
# Actions based on selected option
|
|
case "$selected_option" in
|
|
"")
|
|
exit
|
|
;;
|
|
"Enable Wi-Fi")
|
|
notify-send "Scanning for networks..."
|
|
nmcli radio wifi on
|
|
nmcli device wifi rescan
|
|
sleep 3
|
|
;;
|
|
"Disable Wi-Fi")
|
|
notify-send "Wi-Fi Disabled"
|
|
nmcli radio wifi off
|
|
exit
|
|
;;
|
|
"Manual Entry")
|
|
# Prompt for SSID
|
|
manual_ssid=$(rofi -dmenu -config "${config}" -theme-str "${override_ssid}" -p " " || pkill -x rofi)
|
|
|
|
# Exit if no option is selected
|
|
if [ -z "$manual_ssid" ]; then
|
|
exit
|
|
fi
|
|
|
|
# Prompt for Wi-Fi password
|
|
wifi_password=$(get_password)
|
|
|
|
if [ -z "$wifi_password" ]; then
|
|
# Without password
|
|
if nmcli device wifi connect "$manual_ssid" | grep -q "successfully"; then
|
|
notify-send "Connected to \"$manual_ssid\"."
|
|
exit
|
|
else
|
|
notify-send "Failed to connect to \"$manual_ssid\"."
|
|
fi
|
|
else
|
|
# With password
|
|
if nmcli device wifi connect "$manual_ssid" password "$wifi_password" | grep -q "successfully"; then
|
|
notify-send "Connected to \"$manual_ssid\"."
|
|
exit
|
|
else
|
|
notify-send "Failed to connect to \"$manual_ssid\"."
|
|
fi
|
|
fi
|
|
;;
|
|
*)
|
|
# Get saved connections
|
|
saved_connections=$(nmcli -g NAME connection)
|
|
|
|
if echo "$saved_connections" | grep -qw "$selected_ssid"; then
|
|
if nmcli connection up id "$selected_ssid" | grep -q "successfully"; then
|
|
notify-send "Connected to \"$selected_ssid\"."
|
|
exit
|
|
else
|
|
notify-send "Failed to connect to \"$selected_ssid\"."
|
|
fi
|
|
else
|
|
# Handle secure network connection
|
|
if [[ "$selected_option" =~ ^"" ]]; then
|
|
wifi_password=$(get_password)
|
|
fi
|
|
|
|
if nmcli device wifi connect "$selected_ssid" password "$wifi_password" | grep -q "successfully"; then
|
|
notify-send "Connected to \"$selected_ssid\"."
|
|
exit
|
|
else
|
|
notify-send "Failed to connect to \"$selected_ssid\"."
|
|
fi
|
|
fi
|
|
;;
|
|
esac
|
|
done
|