#!/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_success() { 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_success "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_success "Enabling connection" \ nmcli c up "$CONNNAME" fi } togglegsm() { if nmcli radio wwan | grep -q "enabled"; then sxmo_notify_user.sh "Disabling GSM" nmcli radio wwan off else sxmo_notify_user.sh "Enabling GSM" nmcli radio wwan on 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_success "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.sh -p "Alias" )" [ -z "$CONNNAME" ] && return echo "$CONNNAME" | grep -q "Close Menu" && return APN="$( echo "$icon_cls Close Menu" | sxmo_dmenu.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_success "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 < 63)" return fi channel="$( printf "%s Close Menu\n11\n" "$icon_cls" | sxmo_dmenu.sh -p "Channel" )" [ -z "$channel" ] && return echo "$channel" | grep -q "Close Menu" && return notify_success "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 $( if nmcli radio wwan | grep -q "enabled"; then printf "%s Disable GSM\n" $icon_modem_disabled else printf "%s Enable GSM\n" $icon_modem_registered fi ) $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 ;; *"Disable GSM"|*"Enable GSM" ) togglegsm ;; *"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