You are here
Querying Connectivity
You're application almost always needs to know if there is a working network connection. This is typically handled by placing the connection attempt in a try...catch block. That works, but can be slow, and it means the UI can't really adapt to the level of current connectivity. A much better solution is to query the NetworkManager [used by every mainstream distribution] via the System D-Bus for the current connectivity. This method is used by many applications from GNOME's Evolution to Mozilla's Firefox - but it doesn't seem to get much press coverage. So here is a simple example to query connectivity via Python [assuming NetworkManager 0.9 or later]:
#!/usr/bin/env python
import dbus
NM_BUS_NAME = 'org.freedesktop.NetworkManager'
NM_OBJECT_PATH = '/org/freedesktop/NetworkManager'
NM_INTERFACE_NAME = 'org.freedesktop.NetworkManager'
NM_STATE_INDEX = { 0: 'Unknown',
10: 'Asleep',
20: 'Disconnected',
30: 'Disconnecting',
40: 'Connecting',
50: 'Connected (Local)',
60: 'Connected (Site)',
70: 'Connected (Global)' }
if __name__ == "__main__":
bus = dbus.SystemBus()
manager = bus.get_object(NM_BUS_NAME, NM_OBJECT_PATH)
interface = dbus.Interface(manager, NM_INTERFACE_NAME)
state = interface.state()
if state in NM_STATE_INDEX:
print('Current Network State: {0}'.format(NM_STATE_INDEX[state]))
else:
print('Network Manager state not recognized.')
FYI: if you search the interwebz for the NetworkManager API specification ... every search engine will send you to the wrong place; either just wrong or to the documentation of an older version of the API. The current API specification is here.