#!/usr/bin/env bash # Script to listen for networkmanager updates and return an appriopriate icon and tooltip. # This script runs until it's manually terminated. # Requires: NetworkManager, gawk # Usage: networkmanager # shellcheck source=/dev/null source "$(dirname "$0")"/utils # get initialize network device info and states nm="$(nmcli d | jc --nmcli | jaq -r '.[] | select(.type | test("^(wifi|ethernet)$", "ix"))')" icons=("" "" "" "" "") function toggle() { status=$(rfkill -J | jaq -r '.rfkilldevices[] | select(.type == "wlan") | .soft' | head -1) if [ "$status" = "unblocked" ]; then rfkill block wlan else rfkill unblock wlan fi } function gen_wifi() { signal=$(nmcli -t -f in-use,ssid,signal dev wifi | rg '\*' | sed 's/\"/\\"/g' | awk -F: '{print $3}') level=$(awk -v n="$signal" 'BEGIN{print int((n-1)/20)}') if [ "$level" -gt 4 ]; then level=4 fi icon=${icons[$level]} color="#cba6f7" class="net-connected" name=$(echo "$nm" | jaq -r 'select(.type == "wifi") .connection') } function gen_ethernet() { icon="" class="net-connected" color="#cba6f7" name=$(echo "$nm" | jaq -r 'select(.type == "ethernet") .connection') } function make_content() { local ethernet wifi ethernet=$(echo "$nm" | jaq -r 'select(.type == "ethernet") .state') wifi=$(echo "$nm" | jaq -r 'select(.type == "wifi") .state') # test ethernet first if [[ $ethernet == "connected" ]]; then gen_ethernet elif [[ $wifi == "connected" ]]; then gen_wifi else icon="" color="#988ba2" class="net-disconnected" name="Disconnected" fi jaq --null-input -r -c \ --arg icon "$icon" \ --arg name "$name" \ --arg color "$color" \ --arg class "$class" \ '{"icon": $icon, "name": $name, "color": $color, "class": $class}' } # first run make_content last_time=$(get_time_ms) nmcli monitor | while read -r _; do current_time=$(get_time_ms) delta=$((current_time - last_time)) # 50ms debounce if [[ $delta -gt 50 ]]; then sleep 0.5 nm="$(nmcli d | jc --nmcli | jaq -r '.[] | select(.type | test("^(wifi|ethernet)$", "ix"))')" make_content # reset debounce timer last_time=$(get_time_ms) fi done