
Part of !537. https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/537
107 lines
2.9 KiB
Python
Executable File
107 lines
2.9 KiB
Python
Executable File
#!/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)
|