Introspection: figuring out the rules
Fun with Network Manager
Create a service
Gobject Introspection
Let's figure out how to use dbus to get detailed information out of Network Manager (NM), and then to plug our own information back into NM.
Example #1: This script determines if a specific network is the active connection. This is handy for, say, mapping network printers or networked drives, or setting the time, or automating backups, or lots of other stuff.
#!/bin/sh
# What network am I on?
# Get the Active Connection path
# Result should be like: /org/freedesktop/NetworkManager/ActiveConnection/187
active_connection_path=$( dbus-send --system --print-reply \
--dest=org.freedesktop.NetworkManager \
/org/freedesktop/NetworkManager \
org.freedesktop.DBus.Properties.Get \
string:"org.freedesktop.NetworkManager" \
string:"ActiveConnections" \
| grep ActiveConnection/ | cut -d'"' -f2 )
# Get the Access Point path
# Result should be like: /org/freedesktop/NetworkManager/AccessPoint/194
access_point_path=$( dbus-send --system --print-reply \
--dest=org.freedesktop.NetworkManager \
"$active_connection_path" \
org.freedesktop.DBus.Properties.Get \
string:"org.freedesktop.NetworkManager.Connection.Active" \
string:"SpecificObject" \
| grep variant | cut -d'"' -f2 )
# Get the Access Point ESSID
# Result should be something like "NETGEAR"
essid=$( dbus-send --system --print-reply \
--dest=org.freedesktop.NetworkManager \
"$access_point_path" \
org.freedesktop.DBus.Properties.Get \
string:"org.freedesktop.NetworkManager.AccessPoint" \
string:"Ssid" \
| grep variant | cut -d'"' -f2 )
# If we are on the HOME network
if [ "$essid"=="MyHomeNet" ]; then
# Do network-specific changes here
elif [ "$essid"=="WorkCorporateNet" ]
# Do network-specific changes here
else
# Do changes for unrecognized network or no network at all here
fi
exit 0
Example #2: Disable networking
$ dbus-send --system --print-reply \
--dest=org.freedesktop.NetworkManager \
/org/freedesktop/NetworkManager \
org.freedesktop.DBus.Properties.Set \
string:"org.freedesktop.NetworkManager" \
string:"NetworkingEnabled" \
variant:boolean:false
Example #3: Enable networking. It's exactly the same as the previous example, except for the last line.
$ dbus-send --system --print-reply \
--dest=org.freedesktop.NetworkManager \
/org/freedesktop/NetworkManager \
org.freedesktop.DBus.Properties.Set \
string:"org.freedesktop.NetworkManager" \
string:"NetworkingEnabled" \
variant:boolean:true
Example #4: Check networking status
$ dbus-send --system --print-reply \
--dest=org.freedesktop.NetworkManager \
/org/freedesktop/NetworkManager \
org.freedesktop.DBus.Properties.Get \
string:"org.freedesktop.NetworkManager" \
string:"NetworkingEnabled"
method return sender=:1.4 -> dest=:1.325 reply_serial=2
variant boolean true
Example #5: Disable Wireless
$ dbus-send --system --print-reply \
--dest=org.freedesktop.NetworkManager \
/org/freedesktop/NetworkManager \
org.freedesktop.DBus.Properties.Set \
string:"org.freedesktop.NetworkManager" \
string:"WirelessEnabled" \
variant:boolean:false
Example #6: Enable Wireless
$ dbus-send --system --print-reply \
--dest=org.freedesktop.NetworkManager \
/org/freedesktop/NetworkManager \
org.freedesktop.DBus.Properties.Set \
string:"org.freedesktop.NetworkManager" \
string:"WirelessEnabled" \
variant:boolean:true
Example #7: Check Wireless Status
$ dbus-send --system --print-reply \
--dest=org.freedesktop.NetworkManager \
/org/freedesktop/NetworkManager \
org.freedesktop.DBus.Properties.Get \
string:"org.freedesktop.NetworkManager" \
string:"WirelessEnabled"
method return sender=:1.4 -> dest=:1.326 reply_serial=2
variant boolean true
Example #8:
Example #9: List all active network connections
$ dbus-send --system --print-reply \
--dest=org.freedesktop.NetworkManager \
/org/freedesktop/NetworkManager \
org.freedesktop.DBus.Properties.Get \
string:"org.freedesktop.NetworkManager" \
string:"ActiveConnections"
method return sender=:1.4 -> dest=:1.328 reply_serial=2
variant array [
object path "/org/freedesktop/NetworkManager/ActiveConnection/18"
]
Example #10: Which interface is the active connection using?
$ dbus-send --system --print-reply \
--dest=org.freedesktop.NetworkManager \
/org/freedesktop/NetworkManager/ActiveConnection/18 \
org.freedesktop.DBus.Properties.Get \
string:"org.freedesktop.NetworkManager.Connection.Active" \
string:"Devices"
method return sender=:1.4 -> dest=:1.331 reply_serial=2
variant array [
object path "/org/freedesktop/NetworkManager/Devices/0"
$ dbus-send --system --print-reply \
--dest=org.freedesktop.NetworkManager \
/org/freedesktop/NetworkManager/Devices/0 \
org.freedesktop.DBus.Properties.Get \
string:"org.freedesktop.NetworkManager.Device" \
string:"Interface"
method return sender=:1.4 -> dest=:1.332 reply_serial=2
variant string "wlan0"
Example #11: Get the current wireless access point
$ dbus-send --system --print-reply \
--dest=org.freedesktop.NetworkManager \
/org/freedesktop/NetworkManager/ActiveConnection/18 \
org.freedesktop.DBus.Properties.Get \
string:"org.freedesktop.NetworkManager.Connection.Active" \
string:"SpecificObject"
method return sender=:1.4 -> dest=:1.334 reply_serial=2
variant object path "/org/freedesktop/NetworkManager/AccessPoint/209"
Example #12: Get the list of all visible wireless access points
$ dbus-send --system --print-reply \
--dest=org.freedesktop.NetworkManager
/org/freedesktop/NetworkManager/Devices/0 \
org.freedesktop.NetworkManager.Device.Wireless.GetAccessPoints
method return sender=:1.4 -> dest=:1.333 reply_serial=2
array [
object path "/org/freedesktop/NetworkManager/AccessPoint/209"
object path "/org/freedesktop/NetworkManager/AccessPoint/208"
object path "/org/freedesktop/NetworkManager/AccessPoint/207"
object path "/org/freedesktop/NetworkManager/AccessPoint/206"
]
Example #13: Read the SSID of the active wireless access point
$ dbus-send --system --print-reply \
--dest=org.freedesktop.NetworkManager \
/org/freedesktop/NetworkManager/AccessPoint/209 \
org.freedesktop.DBus.Properties.Get \
string:"org.freedesktop.NetworkManager.AccessPoint" \
string:"Ssid"
method return sender=:1.4 -> dest=:1.335 reply_serial=2
variant array of bytes "NETGEAR"
Example #14: Read the signal strength of the active wireless point
$ dbus-send --system --print-reply \
--dest=org.freedesktop.NetworkManager \
/org/freedesktop/NetworkManager/AccessPoint/209 \
org.freedesktop.DBus.Properties.Get \
string:"org.freedesktop.NetworkManager.AccessPoint" \
string:"Strength"
method return sender=:1.4 -> dest=:1.340 reply_serial=2
variant byte 54
# 54 in byte (hexadecimal) = 84 in decimal. Strength = 84%
Example #15: Read the stored NM connection that is currently active
$ dbus-send --system --print-reply \
--dest=org.freedesktop.NetworkManager \
/org/freedesktop/NetworkManager/ActiveConnection/18 \
org.freedesktop.DBus.Properties.Get \
string:"org.freedesktop.NetworkManager.Connection.Active" \
string:"Connection"
method return sender=:1.4 -> dest=:1.379 reply_serial=2
variant object path "/org/freedesktop/NetworkManager/Settings/10"
Example #16: Disconnect from the current network connection (auto-reconnect)
$ dbus-send --system --print-reply \
--dest=org.freedesktop.NetworkManager \
/org/freedesktop/NetworkManager \
org.freedesktop.NetworkManager.DeactivateConnection \
objpath:"/org/freedesktop/NetworkManager/ActiveConnection/18"
method return sender=:1.4 -> dest=:1.370 reply_serial=2
Example #17: Disconnect from the current network connection and stay disconnected
$ dbus-send --system --print-reply \
--dest=org.freedesktop.NetworkManager \
/org/freedesktop/NetworkManager/Devices/0 \
org.freedesktop.NetworkManager.Device.Disconnect
method return sender=:1.4 -> dest=:1.354 reply_serial=2
Example #18: Connect to a specific wireless network
$ dbus-send --system --print-reply \
--dest=org.freedesktop.NetworkManager \
org/freedesktop/NetworkManager \
org.freedesktop.NetworkManager.ActivateConnection \
objpath:"/org/freedesktop/NetworkManager/Settings/10" \
objpath:"/org/freedesktop/NetworkManager/Devices/0" \
objpath:"/org/freedesktop/NetworkManager/AccessPoint/209"
method return sender=:1.4 -> dest=:1.382 reply_serial=2
object path "/org/freedesktop/NetworkManager/ActiveConnection/20"
Example #19: Dump all information about an access point
$ dbus-send --system --print-reply \
--dest=org.freedesktop.NetworkManager \
/org/freedesktop/NetworkManager/Settings/10 \
org.freedesktop.NetworkManager.Settings.Connection.GetSettings
method return sender=:1.4 -> dest=:1.386 reply_serial=2
array [## EDITED - it's really long]
4 comments:
Thanks for writing the series. Found it helpful
Thanks for writing this, what a confusing API! ;-)
Thanks, it's very userfull.. :D
Thanks for.
Little notice: is system can be more than one active connection like this:
/org/freedesktop/NetworkManager/ActiveConnection/2
/org/freedesktop/NetworkManager/ActiveConnection/1
/org/freedesktop/NetworkManager/ActiveConnection/0
so, script #1 can drop an error:
process 13760: arguments to dbus_message_new_method_call() were incorrect, assertion "_dbus_check_is_valid_path (path)" failed in file dbus-message.c line 1266.
This is normally a bug in some application using the D-Bus library.
D-Bus not built with -rdynamic so unable to print a backtrace
one of possible solutions is to made active_connection_path as array
active_connection_path=( $( ... ) )
and use ${active_connection_path[0]} (or some other index or in loop) instead $active_connection_path in secondary dbus-send
Post a Comment