#!/usr/bin/env osh
shopt -s strict:all; shopt --unset strict_errexit
DEP="
networkmanager dnsmasq networkmanager networkmanager-cli
networkmanager-openrc networkmanager-tui networkmanager-wifi
networkmanager-wwan
"
DEC="Allows managing gsm/wpa connections via underlying nmcli calls"
DOC="
Allows mangaging gsm/wpa connectiona via nmcli. Allows for creating,
deleting, enabling, and disabling networks via prompts. Prints
status of connected networks between prompts. Also allows scanning
wireless networks.
"
promptok() {
[ -p /tmp/fbp.fifo ] && echo -e "\b\f\rok" > /tmp/fbp.fifo
read -p Ok
}
addgsm() {
[ -p /tmp/fbp.fifo ] && echo -e "\f\e\acancel" > /tmp/fbp.fifo
read -p "Alias: " ALIAS
[ "$ALIAS" = "cancel" ] && return
[ -p /tmp/fbp.fifo ] && echo -e "\f\e\acancel" > /tmp/fbp.fifo
read -p "APN: " APN
[ "$APN" = "cancel" ] && return
nmcli c add \
type gsm \
ifname "$(nmcli d | grep -m 1 "gsm" | cut -d' ' -f1)" \
con-name "$ALIAS" \
apn "$APN"
}
installpolkitrule() {
TARGETFILE="/etc/polkit-1/rules.d/00-f_scripts-f_networks-nmplugdev.rules"
test -f "$TARGETFILE" || {
echo "Installing polkit rule for modemmanager"
[ -p /tmp/fbp.fifo ] && echo -e "\a" > /tmp/fbp.fifo
sudo mkdir -p "$(dirname "$TARGETFILE")"
echo '
polkit.addRule(function(action, subject) {
if (
action.id.indexOf("org.freedesktop.NetworkManager.") == 0 &&
subject.isInGroup("plugdev")
) { return polkit.Result.YES; }
});
' | sudo tee "$TARGETFILE"
sudo chmod -R +r "$(dirname "$TARGETFILE")"
sudo addgroup "$USER" plugdev
}
}
addwpa() {
[ -p /tmp/fbp.fifo ] && echo -e "\f\e\acancel" > /tmp/fbp.fifo
read -p "SSID: " SSID
[ "$SSID" = "cancel" ] && return
[ -p /tmp/fbp.fifo ] && echo -e "\f\e\acancel" > /tmp/fbp.fifo
read -p "PASSPHRASE: " PASSPHRASE
[ "$PASSPHRASE" = "cancel" ] && return
nmcli c add \
type wifi \
ifname wlan0 \
con-name "$SSID" \
802-11-wireless-security.key-mgmt wpa-psk \
ssid "$SSID" \
802-11-wireless-security.psk "$PASSPHRASE"
}
deletenetwork() {
echo "Delete a network:"
networkslist
[ -p /tmp/fbp.fifo ] && { echo -e "\b\f\r"; echo "cancel"; networkslist; } > /tmp/fbp.fifo
read -p "Network: " NETWORK
[ "$NETWORK" = "cancel" ] && return
nmcli c delete "$NETWORK"
}
scanwifi() {
nmcli d wifi list
}
status() {
echo "Status:"
nmcli -p device
echo "Active networks:"
nmcli -c no -t c show --active
echo "All networks:"
nmcli -c no -t c show
}
networkslist() {
nmcli -c no -t c show | cut -d: -f1
}
ensurenmrunning() {
rc-service networkmanager status | grep started &&
rc-service ntpd status | grep started ||
{
sudo /etc/init.d/networkmanager start
sudo /etc/init.d/ntpd start
sudo rc-update add networkmanager boot
sudo rc-update add ntpd boot
}
}
togglenetwork() {
NETWORK="$1"
if nmcli -c no -t c show --active | cut -d: -f1 | grep "$NETWORK"; then
nmcli c down "$NETWORK"
else
nmcli c up "$NETWORK"
fi
}
main() {
local ACTION OPTS
env | grep -q "^$(basename "$0" | tr '[a-z]' '[A-Z]')=" || eval "$VAR"
installpolkitrule
ensurenmrunning
while true; do
status
OPTS="addgsm addwpa deletenetwork scanwifi"
[ -p /tmp/fbp.fifo ] && { echo -e "\b\f\r"; echo "$OPTS" | tr " " "\n"; networkslist; } > /tmp/fbp.fifo
read -p "Action ($OPTS): " ACTION
networkslist | grep "$ACTION" && togglenetwork "$ACTION" && promptok && continue
"$ACTION"; promptok
done
}
if [ -n "$1" ]; then "$@"; else main; fi