Files
sxmo-utils/scripts/core/sxmo_networks.sh
Willow Barraco bd6473dcfb sxmo_networks.sh: cleanup notifications
We was still using the plain stdout message from the commands.
2023-10-31 11:29:12 +01:00

298 lines
6.8 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
. sxmo_common.sh
set -e
VPNDEVICE="$(nmcli con show --active | grep -E 'wireguard|vpn' | awk '{ print $1 }' | paste -s -d '|')"
nofail() {
"$@" || return 0
}
stderr() {
sxmo_log "$*"
}
menu() {
dmenu -i "$@"
}
notify_sucess() {
MSG="$1"
shift
if "$@"; then
sxmo_notify_user.sh "$MSG succeed"
else
sxmo_notify_user.sh "$MSG failure"
stderr "$*"
fi
}
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 -E "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-)"
notify_sucess "Disabling connection" \
nmcli c down "$CONNNAME"
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
sxmo_notify_user.sh "Enabling wifi first."
doas sxmo_wifitoggle.sh
fi
notify_sucess "Enabling connection" \
nmcli c up "$CONNNAME"
fi
}
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-)"
notify_sucess "Deleting connection" \
nmcli c delete "$CONNNAME"
}
getifname() {
IFTYPE="$1"
IFNAME="$(nmcli d | grep -m 1 "$IFTYPE" | cut -d' ' -f1)"
if [ -z "$IFNAME" ]; then
sxmo_notify_user.sh "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
notify_sucess "Adding connection" \
nmcli c add type gsm ifname "$(getifname gsm)" con-name "$CONNNAME" \
apn "$APN" ${PASSWORD:+gsm.password "$PASSWORD"} \
${USERNAME:+gsm.username "$USERNAME"}
}
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
notify_sucess "Adding connection" \
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"}
}
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
notify_sucess "Adding hotspot" \
nmcli c add type ethernet ifname usb0 con-name "$CONNNAME" \
ipv4.method shared
}
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
sxmo_notify_user.sh "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
sxmo_notify_user.sh "key too short ($keylen < 8)"
return
elif [ $keylen -gt 63 ]; then
sxmo_notify_user.sh "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
notify_sucess "Adding hotspot wifi" \
nmcli device wifi hotspot ifname wlan0 con-name "Hotspot $SSID" \
ssid "$SSID" channel "$channel" band bg password "$key"
}
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