Files
sxmo-utils/scripts/core/sxmo_networks.sh
Willow Barraco db0cbac8ab Add an explicit "None" choice while adding wpa network passphrase
And refactorise those menu choices computing…

Signed-off-by: Willow Barraco <contact@willowbarraco.fr>
Signed-off-by: Peter John Hartman <peterjohnhartman@gmail.com>
2023-03-23 13:45:40 -05:00

311 lines
6.9 KiB
Bash
Executable File

#!/bin/sh
# SPDX-License-Identifier: AGPL-3.0-only
# Copyright 2022 Sxmo Contributors
# include common definitions
# shellcheck source=configs/default_hooks/sxmo_hook_icons.sh
. sxmo_hook_icons.sh
# shellcheck source=scripts/core/sxmo_common.sh
. "$(dirname "$0")/sxmo_common.sh"
set -e
VPNDEVICE="$(nmcli con show --active | grep -E 'wireguard|vpn' | awk '{ print $1 }')"
nofail() {
"$@" || return 0
}
stderr() {
sxmo_log "$*"
}
menu() {
dmenu -i "$@"
}
connections() {
nmcli -c no -f device,type,name -t c show | \
sed "s/802-11-wireless:/$icon_wif /" | \
sed "s/gsm:/$icon_mod /" | \
sed "s/vpn*:/$icon_key /" |\
sed "s/wireguard*:/$icon_key /" |\
sed "s/802-3-ethernet:/$icon_usb /" | \
sed "s/^:/$icon_dof /" |\
sed "s/^cdc-wdm.*:/$icon_don /" |\
sed "s/^$VPNDEVICE.*:/$icon_don /" |\
sed "s/^wlan.*:/$icon_don /" |\
sed "s/^wwan.*:/$icon_don /" |\
sed "s/^eth.*:/$icon_don /" |\
sed "s/^usb.*:/$icon_don /"
}
toggleconnection() {
CONNLINE="$1"
if echo "$CONNLINE" | grep -q "^$icon_don "; then
CONNNAME="$(echo "$CONNLINE" | cut -d' ' -f3-)"
RES="$(nofail nmcli c down "$CONNNAME" 2>&1)"
else
CONNNAME="$(echo "$CONNLINE" | cut -d' ' -f3-)"
rfkill list wifi | grep -q "yes" || WIFI_ENABLED=1
if [ "$(echo "$CONNLINE" | cut -d' ' -f2)" = "$icon_wif" ] && [ -z "$WIFI_ENABLED" ]; then
notify-send "Enabling wifi first."
doas sxmo_wifitoggle.sh
fi
RES="$(nofail nmcli c up "$CONNNAME" 2>&1)"
fi
notify-send "$RES"
stderr "$RES"
}
deletenetworkmenu() {
CHOICE="$(
printf %b "$icon_cls Close Menu\n$(connections)" |
menu -p "Delete Network"
)"
[ -z "$CHOICE" ] && return
echo "$CHOICE" | grep -q "Close Menu" && return
CONNNAME="$(echo "$CHOICE" | cut -d' ' -f3-)"
RES="$(nofail nmcli c delete "$CONNNAME" 2>&1)"
notify-send "$RES"
stderr "$RES"
}
getifname() {
IFTYPE="$1"
IFNAME="$(nmcli d | grep -m 1 "$IFTYPE" | cut -d' ' -f1)"
if [ -z "$IFNAME" ]; then
notify-send "No interface with type $IFTYPE found"
stderr "No interface with type $IFTYPE found"
IFNAME=lo
fi
echo "$IFNAME"
}
addnetworkgsmmenu() {
CONNNAME="$(
echo "$icon_cls Close Menu" |
sxmo_dmenu_with_kb.sh -p "Alias"
)"
[ -z "$CONNNAME" ] && return
echo "$CONNNAME" | grep -q "Close Menu" && return
APN="$(
echo "$icon_cls Close Menu" |
sxmo_dmenu_with_kb.sh -p "APN"
)"
[ -z "$APN" ] && return
echo "$APN" | grep -q "Close Menu" && return
USERNAME="$(printf "None\n%s Close Menu\n" "$icon_cls" | menu -p "Username")"
case "$USERNAME" in
""|"$icon_cls Close Menu")
return
;;
None)
unset USERNAME
;;
esac
PASSWORD="$(printf "None\n%s Close Menu\n" "$icon_cls" | menu -p "Password")"
case "$PASSWORD" in
""|"$icon_cls Close Menu")
return
;;
None)
unset PASSWORD
;;
esac
RES="$(nofail nmcli c add \
type gsm \
ifname "$(getifname gsm)" \
con-name "$CONNNAME" \
apn "$APN" \
${PASSWORD:+gsm.password "$PASSWORD"} \
${USERNAME:+gsm.username "$USERNAME"} \
2>&1)"
stderr "$RES"
notify-send "$RES"
}
addnetworkwpamenu() {
SSID="$(cat <<EOF | sxmo_dmenu_with_kb.sh -p "SSID"
$icon_cls Close Menu
$(nmcli d wifi list | tail -n +2 | grep -v '^\*' | awk -F' ' '{ print $6 }' | grep -v '\-\-')
EOF
)"
[ -z "$SSID" ] && return
echo "$SSID" | grep -q "Close Menu" && return
PASSPHRASE="$(cat <<EOF | sxmo_dmenu_with_kb.sh -p "Passphrase"
$icon_cls Close Menu
None
EOF
)"
if [ -z "$PASSPHRASE" ] || [ "None" = "$PASSPHRASE" ]; then
unset PASSPHRASE
fi
echo "$PASSPHRASE" | grep -q "Close Menu" && return
RES="$(nofail nmcli c add \
type wifi \
ifname wlan0 \
con-name "$SSID" \
ssid "$SSID" \
${PASSPHRASE:+802-11-wireless-security.key-mgmt wpa-psk 802-11-wireless-security.psk "$PASSPHRASE"} 2>&1)"
stderr "$RES"
notify-send "$RES"
}
addhotspotusbmenu() {
CONNNAME="$(
echo "$icon_cls Close Menu" |
sxmo_dmenu_with_kb.sh -p "Alias"
)"
[ -z "$CONNNAME" ] && return
echo "$CONNNAME" | grep -q "Close Menu" && return
# TODO: restart udhcpd after disconnecting on postmarketOS
RES="$(nofail nmcli c add \
type ethernet \
ifname usb0 \
con-name "$CONNNAME" \
ipv4.method shared 2>&1)"
stderr "$RES"
notify-send "$RES"
}
addhotspotwifimenu() {
SSID="$(
echo "$icon_cls Close Menu" |
sxmo_dmenu_with_kb.sh -p "SSID"
)"
[ -z "$SSID" ] && return
echo "$SSID" | grep -q "Close Menu" && return
key="$(
echo "$icon_cls Close Menu" |
sxmo_dmenu_with_kb.sh -p "Passphrase"
)"
[ -z "$key" ] && return
echo "$key" | grep -q "Close Menu" && return
key1="$(
echo "$icon_cls Close Menu" |
sxmo_dmenu_with_kb.sh -p "Confirm"
)"
[ -z "$key1" ] && return
echo "$key1" | grep -q "Close Menu" && return
if [ "$key" != "$key1" ]; then
notify-send "key mismatch"
stderr "key mismatch"
return
fi
# valid keys for WPA networks have a lengths of 8-63 characters
keylen=$( echo "$key" | tr -d '\n' | wc -c )
keylen=$(( keylen ))
if [ $keylen -lt 8 ]; then
notify-send "key too short ($keylen < 8)"
stderr "key too short ($keylen < 8)"
return
elif [ $keylen -gt 63 ]; then
notify-send "key too long ($keylen > 63)"
stderr "key too long ($keylen > 63)"
return
fi
channel="$(
printf "%s Close Menu\n11\n" "$icon_cls" | sxmo_dmenu_with_kb.sh -p "Channel"
)"
[ -z "$channel" ] && return
echo "$channel" | grep -q "Close Menu" && return
RES="$(nofail nmcli device wifi hotspot ifname wlan0 \
con-name "Hotspot $SSID" \
ssid "$SSID" \
channel "$channel" \
band bg password "$key")"
stderr "$RES"
notify-send "$RES"
}
networksmenu() {
while true; do
CHOICE="$(
rfkill list wifi | grep -q "yes" || WIFI_ENABLED=1
grep . << EOF | sxmo_dmenu.sh -p "Networks"
$icon_cls Close Menu
$(
if [ -z "$WIFI_ENABLED" ]; then
connections | grep -v "$icon_wif"
else
connections
fi
)
$icon_mod Add a GSM Network
$([ -z "$WIFI_ENABLED" ] || printf "%s Add a WPA Network\n" "$icon_wif")
$([ -z "$WIFI_ENABLED" ] || printf "%s Add a Wifi Hotspot\n" "$icon_wif")
$icon_usb Add a USB Hotspot
$icon_cls Delete a Network
$(
if [ -z "$WIFI_ENABLED" ]; then
printf "%s Enable Wifi\n" "$icon_wif"
else
printf "%s Disable Wifi\n" "$icon_wif"
fi
)
$icon_cfg Nmtui
$icon_cfg Ifconfig
$([ -z "$WIFI_ENABLED" ] || printf "%s Scan Wifi Networks\n" "$icon_wif")
EOF
)" || exit
case "$CHOICE" in
*"Close Menu" )
exit
;;
*"Add a GSM Network" )
addnetworkgsmmenu
;;
*"Add a WPA Network" )
addnetworkwpamenu
;;
*"Add a Wifi Hotspot" )
addhotspotwifimenu
;;
*"Add a USB Hotspot")
addhotspotusbmenu
;;
*"Delete a Network" )
deletenetworkmenu
;;
*"Nmtui" )
sxmo_terminal.sh nmtui || continue # Killeable
;;
*"Ifconfig" )
sxmo_terminal.sh watch -n 2 ifconfig || continue # Killeable
;;
*"Scan Wifi Networks" )
sxmo_terminal.sh watch -n 2 nmcli d wifi list || continue # Killeable
;;
*"Disable Wifi"|*"Enable Wifi" )
doas sxmo_wifitoggle.sh
;;
*)
toggleconnection "$CHOICE"
;;
esac
done
}
if [ $# -gt 0 ]; then
"$@"
else
networksmenu
fi