# Python API to talk to NetworkManager

NetworkManager provides a detailed and capable D-Bus interface on the system bus. You can use this interface to query NetworkManager about the overall state of the network and details of network devices like current IP addresses or DHCP options, and to configure, activate and deactivate network connections.

python-networkmanager takes this D-Bus interface and wraps D-Bus interfaces in classes and D-Bus methods and properties in their python equivalents.

## The `NetworkManager` module

All the code is contained in one module: `NetworkManager`. Using it is as simple as you think it is:

    >>> import NetworkManager
    >>> NetworkManager.NetworkManager.Version
    '1.2.0'

NetworkManager exposes a lot of information via D-Bus and also allows full control of network settings. The full D-Bus interface can be found on NetworkManager project website. All interfaces listed there have been wrapped in classes as listed below.

`NetworkManager.``const`(prefix, value)

Many of NetworkManagers D-Bus methods expect or return numeric constants, for which there are enums in the C source code. These constants, such as `NM_STATE_CONNECTED_GLOBAL`, can all be found in the `NetworkManager` module as well. The `const()` function can help you translate them to text. For example:

    >>> NetworkManager.const('state', 40)
    'connecting'
    >>> NetworkManager.const('device_type', 2)
    'wifi'

## List of classes

class `NetworkManager.``ObjectVanished`

This Exception will be raised when you try to call a method or access a property on a dbus object that no longer exists. Objects can go missing if devices are removed, connections are disabled or NetworkManager is restarted.

class `NetworkManager.``NMDbusInterface`

This is the base class of all classes below. It handles the marshalling of data and the automatic creation of properties and methods.

Each property, method and signal exposed via the D-Bus interface is automatically mirrored as an attribute of the actual classes. Moreover, the data is made slightly more usable by performing the following transformations on received and sent data.

- IP addresses are returned as strings of the form `1.2.3.4` instead of network byte ordered integers.
- Route metrics are returned in host byte order, so you can use them as integers.
- Mac addresses and BSSIDs are always returned as strings of the form `00:11:22:33:44:55` instead of byte sequences.
- Wireless SSID’s are returned as strings instead of byte sequences. They will be decoded as UTF-8 data, so using any other encoding for your SSID will result in errors.
- DHCP options are turned into integers or booleans as appropriate
- Signals can be connected to using calls to OnSignalName functions.

Here’s a short example to illustrate:

    >>> NetworkManager.NetworkManager.Version
    '1.4.4'
    >>> NetworkManager.NetworkManager.GetPermissions()
    {'org.freedesktop.NetworkManager.checkpoint-rollback': 'auth',
     'org.freedesktop.NetworkManager.enable-disable-network': 'yes',
     ...}
    # Must have a mainloop to use signals
    >>> import dbus.mainloop.glib
    >>> dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
    >>> NetworkManager.Networkmanager.OnStateChanged(handle_state_change)

class `NetworkManager.``TransientNMDbusInterface`

Subclasses of this class, which are ActiveConnection, NSP, IP[46]Config and DHCP[46]Config never survive a NetworkManager restart. Other objects may survive a restart, but get a different object path.

class `NetworkManager.``NetworkManager`

The main NetworkManager object; the NetworkManager.Networkmanager object is actually the singleton instance of this class.

class `NetworkManager.``Settings`

The Settings object, which can be used to add connections, list connections or update your hostname; the NetworkManager.Settings object is actually the singleton instance of this class.

class `NetworkManager.``AgentManager`

The AgentManager object, whose methods you’ll need to call when implementing a secrets agent; the NetworkManager.AgentManager object is actually the singleton instance of this class.

class `NetworkManager.``Connection`

Connection objects represent network configurations configured by the user.

class `NetworkManager.``ActiveConnection`

class `NetworkManager.``VPNConnection`

Active connections are represented by ActiveConnection objects. VPNConnection is a subclass for active VPN connection that implements both the Connection.Active and VPN.Connection interfaces.

class `NetworkManager.``IP4Config`

class `NetworkManager.``IP6Config`

class `NetworkManager.``DHCP4Config`

class `NetworkManager.``DHCP6Config`

Active network connections and devices can all have IPv4, IPv6, IPv4 DHCP and IPv6 DHCP information attached to them, which is represented by instances of these classes.

class `NetworkManager.``AccessPoint`

Wifi Accesspoints, as visibly by any 802.11 wifi interface.

class `NetworkManager.``NSP`

Wimax Network Service Providers.

class `NetworkManager.``Device`

All device classes implement the Device interface, which gives you access to basic device properties. Note that you will never see instances of this class, only of its devicetype-specific subclasses which impletemnt not only the Device interface but also their own specific interface. Supported device types are Adsl, Bluetooth, Bond, Bridge, Generic, Infiniband, IPTunnel, Macvlan, Modem, OlpcMesh, Team, Tun, Veth, Vlan, Vxlan, Wimax, Wired and Wireless

class `NetworkManager.``SecretAgent`

The NetworkManager daemon can ask separate programs, called agents, for secrets if it needs them. The NetworkManager applet and the nmcli command-line tool are examples of such agents. You can also write such agents by subclassing the SecretAgent class and providing a GetSecrets method as in the following example, which returns a static password for each secret:

    import dbus.mainloop.glib
    import GObject
    import NetworkManager

    class MyAgent(NetworkManager.SecretAgent):
        def GetSecrets(self, settings, connection, setting_name, hints, flags):
            return {setting_name: {'secrets': {'password': 'TopSecret!'}}}

    agent = MyAgent()
    dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
    Gobject.MainLoop().run()

Beware that NetworkManager will ask each agent in turn in what is in essence random order. Except it will prioritize the program that activated the connection. So if you want to make sure your agent is called first, activate the connection from the same application.