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]
Thanks for writing the series. Found it helpful
ReplyDeleteThanks for writing this, what a confusing API! ;-)
ReplyDeleteThanks, it's very userfull.. :D
ReplyDeleteThanks for.
ReplyDeleteLittle 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