Blame examples/python/dbus/create-bond.py

Packit Service b23acc
#!/usr/bin/env python
Packit Service b23acc
# SPDX-License-Identifier: GPL-2.0+
Packit Service b23acc
#
Packit Service b23acc
# Copyright (C) 2015 Red Hat, Inc.
Packit Service b23acc
#
Packit Service b23acc
Packit Service b23acc
#
Packit Service b23acc
# This example configures a Bond from ethernet devices and activates it
Packit Service b23acc
#
Packit Service b23acc
# NetworkManager D-Bus API:
Packit Service b23acc
# https://developer.gnome.org/NetworkManager/stable/spec.html
Packit Service b23acc
#
Packit Service b23acc
Packit Service b23acc
import dbus, sys, uuid
Packit Service b23acc
from dbus.mainloop.glib import DBusGMainLoop
Packit Service b23acc
from gi.repository import GObject
Packit Service b23acc
Packit Service b23acc
DBusGMainLoop(set_as_default=True)
Packit Service b23acc
Packit Service b23acc
Packit Service b23acc
def add_connection(con):
Packit Service b23acc
    bus = dbus.SystemBus()
Packit Service b23acc
    proxy = bus.get_object(
Packit Service b23acc
        "org.freedesktop.NetworkManager", "/org/freedesktop/NetworkManager/Settings"
Packit Service b23acc
    )
Packit Service b23acc
    settings = dbus.Interface(proxy, "org.freedesktop.NetworkManager.Settings")
Packit Service b23acc
    return settings.AddConnection(con)
Packit Service b23acc
Packit Service b23acc
Packit Service b23acc
def create_bond(bond_name):
Packit Service b23acc
    bond_opts = dbus.Dictionary({"mode": "4"})
Packit Service b23acc
    s_bond = dbus.Dictionary({"options": bond_opts})
Packit Service b23acc
    s_con = dbus.Dictionary(
Packit Service b23acc
        {
Packit Service b23acc
            "type": "bond",
Packit Service b23acc
            "uuid": str(uuid.uuid4()),
Packit Service b23acc
            "id": bond_name,
Packit Service b23acc
            "interface-name": bond_name,
Packit Service b23acc
            "autoconnect": False,
Packit Service b23acc
            "autoconnect-slaves": 1,
Packit Service b23acc
        }
Packit Service b23acc
    )
Packit Service b23acc
    s_ip4 = dbus.Dictionary({"method": "auto"})
Packit Service b23acc
    s_ip6 = dbus.Dictionary({"method": "ignore"})
Packit Service b23acc
Packit Service b23acc
    con = dbus.Dictionary(
Packit Service b23acc
        {"bond": s_bond, "connection": s_con, "ipv4": s_ip4, "ipv6": s_ip6}
Packit Service b23acc
    )
Packit Service b23acc
    print("Creating bond connection: %s" % bond_name)
Packit Service b23acc
    return add_connection(con)
Packit Service b23acc
Packit Service b23acc
Packit Service b23acc
def create_slave(device, master):
Packit Service b23acc
    slave_name = "bond-" + master + "-slave-" + device
Packit Service b23acc
    s_wired = dbus.Dictionary({"duplex": "full"})
Packit Service b23acc
    s_con = dbus.Dictionary(
Packit Service b23acc
        {
Packit Service b23acc
            "type": "802-3-ethernet",
Packit Service b23acc
            "uuid": str(uuid.uuid4()),
Packit Service b23acc
            "id": slave_name,
Packit Service b23acc
            "interface-name": device,
Packit Service b23acc
            "autoconnect": False,
Packit Service b23acc
            "master": master,
Packit Service b23acc
            "slave-type": "bond",
Packit Service b23acc
        }
Packit Service b23acc
    )
Packit Service b23acc
Packit Service b23acc
    con = dbus.Dictionary({"802-3-ethernet": s_wired, "connection": s_con})
Packit Service b23acc
    print("Creating slave connection: %s" % slave_name)
Packit Service b23acc
    add_connection(con)
Packit Service b23acc
Packit Service b23acc
Packit Service b23acc
def usage():
Packit Service b23acc
    print("Usage: %s <bond_name> <ifname1> ..." % sys.argv[0])
Packit Service b23acc
    sys.exit(0)
Packit Service b23acc
Packit Service b23acc
Packit Service b23acc
if len(sys.argv) < 3:
Packit Service b23acc
    usage()
Packit Service b23acc
Packit Service b23acc
# Create bond master and slave connections
Packit Service b23acc
bond_name = sys.argv[1]
Packit Service b23acc
bond_path = create_bond(bond_name)
Packit Service b23acc
for ifname in sys.argv[2:]:
Packit Service b23acc
    create_slave(ifname, bond_name)
Packit Service b23acc
Packit Service b23acc
# Activate the bond
Packit Service b23acc
bus = dbus.SystemBus()
Packit Service b23acc
proxy = bus.get_object(
Packit Service b23acc
    "org.freedesktop.NetworkManager", "/org/freedesktop/NetworkManager"
Packit Service b23acc
)
Packit Service b23acc
manager = dbus.Interface(proxy, "org.freedesktop.NetworkManager")
Packit Service b23acc
ac = manager.ActivateConnection(bond_path, "/", "/")
Packit Service b23acc
print("Activating bond: %s (%s)" % (bond_name, ac))
Packit Service b23acc
Packit Service b23acc
# Monitor the active bond connection
Packit Service b23acc
loop = GObject.MainLoop()
Packit Service b23acc
Packit Service b23acc
Packit Service b23acc
def properties_changed(props):
Packit Service b23acc
    if "State" in props:
Packit Service b23acc
        if props["State"] == 2:
Packit Service b23acc
            print("Successfully connected")
Packit Service b23acc
            loop.quit()
Packit Service b23acc
        if props["State"] == 3 or props["State"] == 4:
Packit Service b23acc
            print("Bond activation failed")
Packit Service b23acc
            loop.quit()
Packit Service b23acc
Packit Service b23acc
Packit Service b23acc
obj = bus.get_object("org.freedesktop.NetworkManager", ac)
Packit Service b23acc
iface = dbus.Interface(obj, "org.freedesktop.NetworkManager.Connection.Active")
Packit Service b23acc
iface.connect_to_signal("PropertiesChanged", properties_changed)
Packit Service b23acc
Packit Service b23acc
loop.run()