#!/usr/bin/env python
# SPDX-License-Identifier: GPL-2.0+
#
# Copyright (C) 2010 - 2012 Red Hat, Inc.
#
#
# This example starts or stops a wifi hotspot
#
# Configuration settings are described at
# https://developer.gnome.org/NetworkManager/1.0/ref-settings.html
#
import dbus, sys, time
our_uuid = "2b0d0f1d-b79d-43af-bde1-71744625642e"
s_con = dbus.Dictionary(
{"type": "802-11-wireless", "uuid": our_uuid, "id": "Test Hotspot"}
)
s_wifi = dbus.Dictionary(
{
"ssid": dbus.ByteArray("My Hotspot".encode("utf-8")),
"mode": "ap",
"band": "bg",
"channel": dbus.UInt32(1),
}
)
s_wsec = dbus.Dictionary({"key-mgmt": "wpa-psk", "psk": "great password"})
s_ip4 = dbus.Dictionary({"method": "shared"})
s_ip6 = dbus.Dictionary({"method": "ignore"})
con = dbus.Dictionary(
{
"connection": s_con,
"802-11-wireless": s_wifi,
"802-11-wireless-security": s_wsec,
"ipv4": s_ip4,
"ipv6": s_ip6,
}
)
def usage():
print("Usage: %s <ifname> [up|down]" % sys.argv[0])
sys.exit(0)
bus = dbus.SystemBus()
service_name = "org.freedesktop.NetworkManager"
proxy = bus.get_object(service_name, "/org/freedesktop/NetworkManager/Settings")
settings = dbus.Interface(proxy, "org.freedesktop.NetworkManager.Settings")
if len(sys.argv) != 3:
usage()
iface = sys.argv[1]
proxy = bus.get_object(service_name, "/org/freedesktop/NetworkManager")
nm = dbus.Interface(proxy, "org.freedesktop.NetworkManager")
devpath = nm.GetDeviceByIpIface(iface)
# Find our existing hotspot connection
connection_path = None
for path in settings.ListConnections():
proxy = bus.get_object(service_name, path)
settings_connection = dbus.Interface(
proxy, "org.freedesktop.NetworkManager.Settings.Connection"
)
config = settings_connection.GetSettings()
if config["connection"]["uuid"] == our_uuid:
connection_path = path
break
# If the hotspot connection didn't already exist, add it
if not connection_path:
connection_path = settings.AddConnection(con)
# Now start or stop the hotspot on the requested device
proxy = bus.get_object(service_name, devpath)
device = dbus.Interface(proxy, "org.freedesktop.NetworkManager.Device")
operation = sys.argv[2]
if operation == "up":
acpath = nm.ActivateConnection(connection_path, devpath, "/")
proxy = bus.get_object(service_name, acpath)
active_props = dbus.Interface(proxy, "org.freedesktop.DBus.Properties")
# Wait for the hotspot to start up
start = time.time()
while time.time() < start + 10:
state = active_props.Get(
"org.freedesktop.NetworkManager.Connection.Active", "State"
)
if state == 2: # NM_ACTIVE_CONNECTION_STATE_ACTIVATED
print("Access point started")
sys.exit(0)
time.sleep(1)
print("Failed to start access point")
elif operation == "down":
device.Disconnect()
else:
usage()
sys.exit(0)