How can I detect whether the current connection is marked as metered on a system with NetworkManager?
This is from a shell script, but I can easily call any C functions via Python.
How can I detect whether the current connection is marked as metered on a system with NetworkManager?
This is from a shell script, but I can easily call any C functions via Python.
With the nmcli utility, the necessary steps are:
verify NetworkManager is version 1.0.6+:
$ nmcli -v
nmcli tool, version 1.9.0
check GENERAL.METERED on an interface:
$ nmcli -t -f GENERAL.METERED dev show eth1
GENERAL.METERED:unknown
Forcing the value is done like this:
$ nmcli dev modify wlan1 connection.METERED yes
Connection successfully reapplied to device 'wlan1'
$ nmcli -t -f GENERAL.METERED dev show wlan1
GENERAL.METERED:yes
And, to get a list grouped by device:
$ nmcli -t -f GENERAL.DEVICE,GENERAL.METERED dev show
GENERAL.DEVICE:wlan1
GENERAL.METERED:yes
GENERAL.DEVICE:eth1
GENERAL.METERED:unknown
GENERAL.DEVICE:lo
GENERAL.METERED:unknown
Trying to cut this down to info on just the default route would still require a call to another command as NetworkManager doesn't try to distinguish between multiple devices in a connected state:
$ nmcli -t -f GENERAL.DEVICE,GENERAL.METERED dev show `ip route list 0/0 | sed -r 's/.*dev (\S*).*/\1/g'`
ip route
and ideally ip monitor
to reliably track the interface of the default route or relevant server then do/redo the nmcli query. –
Intoxication [[ "$(nmcli -t -f GENERAL.METERED dev show `ip route list 0/0 | sed -r 's/.*dev (\S*).*/\1/g'` | cut -d':' -f2)" == yes* ]]
–
Northampton You can also get the metered status of the current connection via D-Bus. From a shell, you can use busctl
:
busctl get-property org.freedesktop.NetworkManager /org/freedesktop/NetworkManager org.freedesktop.NetworkManager Metered
which is only one command, in contrast to the nmcli
solution, and in other programming languages it can be more efficient to use D-Bus directly instead of having to call nmcli
.
The result is an enum with the following values (documentation):
Name | Value | Description |
---|---|---|
NM_METERED_UNKNOWN |
0 | The metered status is unknown |
NM_METERED_YES |
1 | Metered, the value was explicitly configured |
NM_METERED_NO |
2 | Not metered, the value was explicitly configured |
NM_METERED_GUESS_YES |
3 | Metered, the value was guessed |
NM_METERED_GUESS_NO |
4 | Not metered, the value was guessed |
u 1
. If you prefer JSON, then pass the -j
flag, and you will get output like { "type": "u", "data": 1 }
–
Louisiana D-Spy
app to explore and get the service, object, interface, and property names passed to busctl
. It even tells you the datatype and lets you query the property in real-time. Invaluable! –
Platonic For some reason the solution from lossleader always returns no on my system, while using the metered parameter from the connection works fine:
nmcli -f connection.metered connection show `nmcli -t -f GENERAL.CONNECTION --mode tabular device show $DEVICE | head -n1`
© 2022 - 2024 — McMap. All rights reserved.
nmcli -t -f GENERAL.METERED dev show
(without a device) is a mixture of all possible values for me. – Armillary