diff --git a/bin/omarchy b/bin/omarchy index 8c1fbed2..c5640dfc 100755 --- a/bin/omarchy +++ b/bin/omarchy @@ -51,6 +51,7 @@ GROUP_DESCRIPTIONS[install]="Optional software installers" GROUP_DESCRIPTIONS[launch]="Application launchers" GROUP_DESCRIPTIONS[menu]="Omarchy menu commands" GROUP_DESCRIPTIONS[migrate]="Migration runner" +GROUP_DESCRIPTIONS[network]="Network status helpers" GROUP_DESCRIPTIONS[notification]="Notification helpers" GROUP_DESCRIPTIONS[npm]="NPM package wrappers" GROUP_DESCRIPTIONS[osd]="On-screen display status helpers" diff --git a/bin/omarchy-network-status b/bin/omarchy-network-status new file mode 100755 index 00000000..5c05a2b6 --- /dev/null +++ b/bin/omarchy-network-status @@ -0,0 +1,98 @@ +#!/bin/bash + +# omarchy:summary=Print active network status for the shell +# omarchy:group=network +# omarchy:args=[--verbose] + +verbose=false + +case "${1:-}" in + "") + ;; + --verbose) + verbose=true + ;; + *) + echo "Usage: omarchy-network-status [--verbose]" >&2 + exit 2 + ;; +esac + +print_status() { + local device nm state ssid signal freq + + device=$(ip route get 1.1.1.1 2>/dev/null | awk '{ for (i = 1; i <= NF; i++) if ($i == "dev") { print $(i + 1); exit } }') + + if [[ -z $device ]]; then + printf 'disconnected\t\t\t\n' + return + fi + + if [[ ! -d /sys/class/net/$device/wireless ]]; then + printf 'ethernet\t%s\t\t\n' "$device" + return + fi + + if omarchy-cmd-present nmcli; then + nm=$(nmcli -t -f GENERAL.STATE,GENERAL.CONNECTION dev show "$device" 2>/dev/null) + state=$(awk -F: '$1 == "GENERAL.STATE" { print $2; exit }' <<<"$nm") + ssid=$(awk -F: '$1 == "GENERAL.CONNECTION" { print $2; exit }' <<<"$nm") + signal=$(nmcli -t -f IN-USE,SIGNAL dev wifi list ifname "$device" 2>/dev/null | awk -F: '$1 == "*" { print $2; exit }') + freq=$(iw dev "$device" link 2>/dev/null | awk '/freq:/ { print $2; exit }') + + if [[ $state != 100* ]]; then + printf 'disconnected\t\t\t\n' + return + fi + + printf 'wifi\t%s\t%s\t%s\n' "${ssid:-$device}" "$signal" "$freq" + return + fi + + printf 'wifi\t%s\t\t\n' "$device" +} + +print_verbose() { + local route_json iface gw src prefix link + + route_json=$(ip -j route get 1.1.1.1 2>/dev/null) + [[ -z $route_json ]] && return + + iface=$(jq -r '.[0].dev // ""' <<<"$route_json" 2>/dev/null) + gw=$(jq -r '.[0].gateway // ""' <<<"$route_json" 2>/dev/null) + src=$(jq -r '.[0].prefsrc // ""' <<<"$route_json" 2>/dev/null) + + [[ -z $iface ]] && return + + prefix=$(ip -j addr show "$iface" 2>/dev/null | jq -r '.[0].addr_info[]? | select(.family == "inet") | .prefixlen // ""' 2>/dev/null | head -n 1) + + printf 'iface\t%s\n' "$iface" + printf 'ip\t%s\n' "$src" + printf 'prefix\t%s\n' "$prefix" + printf 'gateway\t%s\n' "$gw" + + if [[ -d /sys/class/net/$iface/wireless ]]; then + printf 'type\twifi\n' + + if omarchy-cmd-present iw; then + link=$(iw dev "$iface" link 2>/dev/null) + + if [[ -n $link ]]; then + printf 'ssid\t%s\n' "$(awk '/SSID:/ { sub(/.*SSID: /, ""); print; exit }' <<<"$link")" + printf 'signal_dbm\t%s\n' "$(awk '/signal:/ { print $2; exit }' <<<"$link")" + printf 'freq\t%s\n' "$(awk '/freq:/ { print $2; exit }' <<<"$link")" + printf 'bitrate\t%s %s\n' "$(awk '/tx bitrate:/ { print $3; exit }' <<<"$link")" "$(awk '/tx bitrate:/ { print $4; exit }' <<<"$link")" + fi + fi + else + printf 'type\tethernet\n' + [[ -r /sys/class/net/$iface/speed ]] && printf 'speed\t%s\n' "$(cat /sys/class/net/$iface/speed)" + [[ -r /sys/class/net/$iface/duplex ]] && printf 'duplex\t%s\n' "$(cat /sys/class/net/$iface/duplex)" + fi +} + +if [[ $verbose == "true" ]]; then + print_verbose +else + print_status +fi diff --git a/shell/plugins/panels/Network.qml b/shell/plugins/panels/Network.qml index 93900d53..eb109cd8 100644 --- a/shell/plugins/panels/Network.qml +++ b/shell/plugins/panels/Network.qml @@ -194,31 +194,6 @@ Panel { Quickshell.execDetached(["bash", "-lc", "printf %s " + Util.shellQuote(value) + " | wl-copy"]) } - function networkCommand() { - return [ - "device=$(ip route get 1.1.1.1 2>/dev/null | awk '{ for (i = 1; i <= NF; i++) if ($i == \"dev\") { print $(i + 1); exit } }')", - "if [[ -z $device ]]; then", - " printf 'disconnected\\t\\t\\t\\n'", - " exit 0", - "fi", - "if [[ ! -d /sys/class/net/$device/wireless ]]; then", - " printf 'ethernet\\t%s\\t\\t\\n' \"$device\"", - " exit 0", - "fi", - "if command -v nmcli >/dev/null; then", - " nm=$(nmcli -t -f GENERAL.STATE,GENERAL.CONNECTION dev show \"$device\" 2>/dev/null)", - " state=$(awk -F: '$1 == \"GENERAL.STATE\" { print $2; exit }' <<<\"$nm\")", - " ssid=$(awk -F: '$1 == \"GENERAL.CONNECTION\" { print $2; exit }' <<<\"$nm\")", - " signal=$(nmcli -t -f IN-USE,SIGNAL dev wifi list ifname \"$device\" 2>/dev/null | awk -F: '$1 == \"*\" { print $2; exit }')", - " freq=$(iw dev \"$device\" link 2>/dev/null | awk '/freq:/ { print $2; exit }')", - " [[ $state != 100* ]] && { printf 'disconnected\\t\\t\\t\\n'; exit 0; }", - " printf 'wifi\\t%s\\t%s\\t%s\\n' \"${ssid:-$device}\" \"$signal\" \"$freq\"", - " exit 0", - "fi", - "printf 'wifi\\t%s\\t\\t\\n' \"$device\"" - ].join("\n") - } - readonly property string icon: { if (kind === "wifi") { var icons = ["󰤯", "󰤟", "󰤢", "󰤥", "󰤨"] @@ -437,35 +412,7 @@ Panel { // Pulls everything we want about the active route's interface in one shot. Process { id: detailsProc - command: ["bash", "-c", ` -route_json=$(ip -j route get 1.1.1.1 2>/dev/null) -[[ -z $route_json ]] && exit 0 -iface=$(echo "$route_json" | python3 -c 'import sys,json; d=json.load(sys.stdin); print(d[0].get("dev",""))' 2>/dev/null) -gw=$(echo "$route_json" | python3 -c 'import sys,json; d=json.load(sys.stdin); print(d[0].get("gateway",""))' 2>/dev/null) -src=$(echo "$route_json" | python3 -c 'import sys,json; d=json.load(sys.stdin); print(d[0].get("prefsrc",""))' 2>/dev/null) -[[ -z $iface ]] && exit 0 -prefix=$(ip -j addr show "$iface" 2>/dev/null | python3 -c 'import sys,json; d=json.load(sys.stdin); ai=d[0].get("addr_info",[]); print(next((str(a.get("prefixlen","")) for a in ai if a.get("family")=="inet"),""))' 2>/dev/null) -printf 'iface\\t%s\\n' "$iface" -printf 'ip\\t%s\\n' "$src" -printf 'prefix\\t%s\\n' "$prefix" -printf 'gateway\\t%s\\n' "$gw" -if [[ -d /sys/class/net/$iface/wireless ]]; then - printf 'type\\twifi\\n' - if command -v iw >/dev/null; then - link=$(iw dev "$iface" link 2>/dev/null) - [[ -n $link ]] && { - printf 'ssid\\t%s\\n' "$(echo "$link" | awk '/SSID:/ { sub(/.*SSID: /, ""); print; exit }')" - printf 'signal_dbm\\t%s\\n' "$(echo "$link" | awk '/signal:/ { print $2; exit }')" - printf 'freq\\t%s\\n' "$(echo "$link" | awk '/freq:/ { print $2; exit }')" - printf 'bitrate\\t%s %s\\n' "$(echo "$link" | awk '/tx bitrate:/ { print $3; exit }')" "$(echo "$link" | awk '/tx bitrate:/ { print $4; exit }')" - } - fi -else - printf 'type\\tethernet\\n' - [[ -r /sys/class/net/$iface/speed ]] && printf 'speed\\t%s\\n' "$(cat /sys/class/net/$iface/speed)" - [[ -r /sys/class/net/$iface/duplex ]] && printf 'duplex\\t%s\\n' "$(cat /sys/class/net/$iface/duplex)" -fi -`] + command: [root.bar ? root.bar.omarchyPath + "/bin/omarchy-network-status" : "omarchy-network-status", "--verbose"] stdout: StdioCollector { waitForEnd: true onStreamFinished: root.updateDetails(text) @@ -1205,7 +1152,7 @@ fi // Bar.qml does not need to mirror network state. Process { id: networkProc - command: ["bash", "-lc", root.bar ? root.networkCommand() : ""] + command: [root.bar ? root.bar.omarchyPath + "/bin/omarchy-network-status" : "omarchy-network-status"] stdout: StdioCollector { waitForEnd: true onStreamFinished: root.updateNetwork(text)