58 lines
1.6 KiB
Nix
58 lines
1.6 KiB
Nix
{
|
|
config,
|
|
lib,
|
|
pkgs,
|
|
...
|
|
}:
|
|
# Desktop network status integrations.
|
|
let
|
|
glyph = code: builtins.fromJSON ''"\u${code}"'';
|
|
|
|
networkStatus = pkgs.writeShellScript "waybar-network-status" ''
|
|
active=$(
|
|
${lib.getExe' pkgs.networkmanager "nmcli"} -t -f DEVICE,TYPE,STATE,CONNECTION device status \
|
|
| ${lib.getExe' pkgs.gawk "awk"} -F: '$3 == "connected" && $2 != "loopback" { print; exit }'
|
|
)
|
|
|
|
if [ -z "$active" ]; then
|
|
${lib.getExe pkgs.jq} -cn \
|
|
--arg text "${glyph "f127"} off" \
|
|
--arg tooltip "Network disconnected" \
|
|
--arg class "disconnected" \
|
|
'{ text: $text, tooltip: $tooltip, class: $class }'
|
|
exit 0
|
|
fi
|
|
|
|
IFS=: read -r device type _state connection <<< "$active"
|
|
|
|
case "$type" in
|
|
wifi) icon="${glyph "f1eb"}" ;;
|
|
ethernet) icon="LAN" ;;
|
|
*) icon="NET" ;;
|
|
esac
|
|
|
|
ipaddr=$(${lib.getExe' pkgs.iproute2 "ip"} -4 -o addr show dev "$device" | ${lib.getExe' pkgs.gawk "awk"} '{ print $4; exit }')
|
|
|
|
${lib.getExe pkgs.jq} -cn \
|
|
--arg text "$icon $connection" \
|
|
--arg tooltip "$device: ''${ipaddr:-no IPv4}" \
|
|
--arg class "$type" \
|
|
'{ text: $text, tooltip: $tooltip, class: $class }'
|
|
'';
|
|
in
|
|
{
|
|
options.modules.desktop.utilities.network.enable =
|
|
lib.mkEnableOption "desktop network status integration";
|
|
|
|
config = lib.mkIf config.modules.desktop.utilities.network.enable {
|
|
registry.waybar.${config.networking.hostName}."custom/network" = {
|
|
order = 60;
|
|
settings = {
|
|
return-type = "json";
|
|
exec = "${networkStatus}";
|
|
interval = 5;
|
|
};
|
|
};
|
|
};
|
|
}
|