#!/bin/bash
# Initialize output
OUTPUT=""
NUMBER=0
# Get all network interfaces (excluding loopback)
mapfile -t INTERFACES < <(ip -o link show | awk -F': ' '{print $2}' | grep -v '^lo$')
# Loop through interfaces
for DEVICE in "${INTERFACES[@]}"; do
# Check if interface is UP
if ! ip link show "$DEVICE" | grep -q "state UP"; then
continue
fi
# Get IP address
IP=$(ip -4 addr show "$DEVICE" | grep -oP '(?<=inet\s)\d+(\.\d+){3}' | head -n 1)
# Skip if no IP assigned
if [[ -z "$IP" ]]; then
continue
fi
# Add separator for multiple connections
if [ "$NUMBER" -gt 0 ]; then
OUTPUT+="<span color='#AEAEAE'> </span>"
fi
((NUMBER++))
# Determine interface type
TYPE="ethernet"
if [[ -L "/sys/class/net/$DEVICE/phy80211" ]] || [[ -d "/sys/class/net/$DEVICE/wireless" ]]; then
TYPE="wifi"
fi
SSID=""
SIGNAL=""
if [ "$TYPE" == "wifi" ]; then
# Get SSID
SSID=$(iw dev "$DEVICE" info 2>/dev/null | grep ssid | awk '{print $2}')
# Try Method 1: iw
if [[ -z "$SIGNAL" ]]; then
WIFI_LINK=$(iw dev "$DEVICE" link 2>/dev/null)
if [[ "$WIFI_LINK" =~ signal:\ ([+-]?[0-9]+) ]]; then
SIGNAL_DBM="${BASH_REMATCH[1]}"
SIGNAL=$((2 * (SIGNAL_DBM + 100)))
[[ "$SIGNAL" -lt 0 ]] && SIGNAL=0
[[ "$SIGNAL" -gt 100 ]] && SIGNAL=100
fi
fi
# Try Method 3: iwd
if [[ -z "$SIGNAL" ]] && command -v iwctl &> /dev/null; then
WIFI_LINK=$(iwctl station "$DEVICE" show 2>/dev/null)
if [[ "$WIFI_LINK" =~ RSSI[[:space:]]+(-?[0-9]+) ]]; then
SIGNAL_DBM="${BASH_REMATCH[1]}"
SIGNAL=$((2 * (SIGNAL_DBM + 100)))
[[ "$SIGNAL" -lt 0 ]] && SIGNAL=0
[[ "$SIGNAL" -gt 100 ]] && SIGNAL=100
fi
fi
# Try Method 2: NetworkManager
if [[ -z "$SIGNAL" ]] && command -v nmcli &> /dev/null; then
SIGNAL=$(nmcli -t -f DEVICE,SIGNAL dev wifi 2>/dev/null | grep "^$DEVICE:" | cut -d':' -f2)
fi
fi
# Define colors based on signal strength
if [[ -z "$SIGNAL" ]]; then
COLOR="#AEAEAE"
BAR="☵"
else
if [ "$SIGNAL" -ge 90 ]; then
BAR="☰"
COLOR="#00FF00"
elif [ "$SIGNAL" -ge 70 ]; then
BAR="☱"
COLOR="#AEFF00"
elif [ "$SIGNAL" -ge 50 ]; then
BAR="☳"
COLOR="#DDFF00"
elif [ "$SIGNAL" -ge 30 ]; then
BAR="☷"
COLOR="#FFDD00"
elif [ "$SIGNAL" -ge 10 ]; then
BAR="⚏"
COLOR="#FFAE00"
else
BAR="⚋"
COLOR="#FF0000"
fi
fi
ECHO=""
if [[ -n "$SSID" ]]; then
ECHO+="$SSID "
fi
ECHO+="$BAR $IP"
OUTPUT+="<span color='$COLOR'>$ECHO</span>"
done
echo "$OUTPUT"
exit 0