ad-hoc part done

Check out naxalnet/naxalnet.py
This commit is contained in:
Pranav Jerry 2021-07-19 14:11:43 +05:30
parent b9592696f2
commit f0689016ce
Signed by: pranav
GPG Key ID: F1DCDC4FED0A0C5B
3 changed files with 62 additions and 84 deletions

View File

@ -27,6 +27,7 @@ IWD_ADAPTER_INTERFACE = "net.connman.iwd.Adapter"
# If you are new to D-Bus, you might want to use a program
# such as D-Feet (https://wiki.gnome.org/Apps/DFeet) for reference.
# And try out iwctl to understand iwd's bus objects
class IWD:
@ -128,9 +129,6 @@ class Device:
self._bus = self._iwd._bus
self._path = self._iwd.get_device_path_from_name(name)
self.reload()
self.name = self._proxy.Name
adapter_path = self._proxy.Adapter
self.adapter = self._iwd.get_name_from_path(adapter_path)
def __str__(self):
return self.name
@ -152,6 +150,10 @@ class Device:
def reload(self):
"""reload the proxy after changing mode"""
self._proxy = self._bus.get_proxy(IWD_BUS, self._path)
self.name = self._proxy.Name
adapter_path = self._proxy.Adapter
# name of adapter ('phy0' for example)
self.adapter = self._iwd.get_name_from_path(adapter_path)
def is_adhoc_started(self):
"""
@ -194,10 +196,18 @@ class Device:
if not self.is_powered_on():
self.power_on()
if self.is_adhoc_started():
self.stop_adhoc()
self._proxy.StartOpen(name)
def stop_adhoc(self):
"""stop adhoc if adhoc is started"""
if self.is_adhoc_started():
self._proxy.Stop()
self.reload()
# TODO: add power_on() and power_off()
class Adapter:
"""represents an adapter as a python object"""
@ -208,6 +218,32 @@ class Adapter:
# Initialise self._proxy
self.reload()
def __str__(self):
return self.name
def reload(self):
"""reload the proxy after changing mode"""
self._proxy = self._bus.get_proxy(IWD_BUS, self._path)
self.name = self._proxy.Name
self.supported_modes = self._proxy.SupportedModes
self.model = self._proxy.Model
self.vendor = self._proxy.Vendor
def is_powered_on(self) -> bool:
"""returns True if adapter is powered on, False otherwise"""
return self._proxy.Powered
def power_on(self):
"""power on the adapter"""
self._proxy.Powered = True
def power_off(self):
"""power off the adapter"""
self._proxy.Powered = False
def supports_mode(self, mode: str) -> bool:
"""
Returns True if the adapter supports the mode
mode can be "ad-hoc", "ap" or "station"
"""
return mode in self.supported_modes

View File

@ -1,16 +0,0 @@
#!/usr/bin/env python3
# This file should import libraries and do
# what /usr/bin/naxalnet used to do
# TODO: change to naxalnet.iwd
from iwd import IWD, Device
iwd = IWD()
devices = iwd.get_devices()
print("Devices:", devices)
for i in devices:
dev = Device(i)
print(dev)

View File

@ -23,8 +23,10 @@ with systemd-networkd and iwd
import sys
from pathlib import Path
from shutil import copy
from dasbus.connection import SystemMessageBus
# from dasbus.connection import SystemMessageBus
from dasbus.error import DBusError
from iwd import IWD, Device, Adapter
NETWORKD_CONFIGS = "/usr/share/naxalnet/networkd"
NETWORKD_VOLATILE_DIR = "/run/systemd/network"
@ -35,6 +37,7 @@ AP_PASSWD = "naxalnet256"
# The D-Bus API does not support creating new interfaces
# or linking to bridges. So we use config files.
# See man:systemd.network(5)
try:
print("Copying network config files")
dest = Path(NETWORKD_VOLATILE_DIR)
@ -52,82 +55,37 @@ except PermissionError as error:
# Now, the iwd part
try:
# connect to the System bus
bus = SystemMessageBus()
# iwd proxy
iwd = bus.get_proxy("net.connman.iwd", "/")
# Get list of all devices
print("Finding connected devices")
objects = iwd.GetManagedObjects()
# devices that support ad-hoc
iwd = IWD()
devices = iwd.get_devices()
adhoc_devices = []
# devices that support ap
ap_devices = []
for path, obj in objects.items():
if "net.connman.iwd.Device" in obj:
# add all devices to the list
name = obj["net.connman.iwd.Device"]["Name"]
print("Found device", name)
adapter_path = obj["net.connman.iwd.Device"]["Adapter"].get_string()
adapter = objects[adapter_path]["net.connman.iwd.Adapter"]
if "ad-hoc" in adapter["SupportedModes"]:
print(name, "supports ad-hoc")
adhoc_devices.append(path)
if "ap" in adapter["SupportedModes"]:
print(name, "supports ap")
ap_devices.append(path)
for i in devices:
d = Device(i)
a = Adapter(d.adapter)
if a.supports_mode("ad-hoc"):
adhoc_devices.append(i)
if a.supports_mode("ap"):
ap_devices.append(i)
if len(adhoc_devices) != 0:
# Start ad-hoc on first device supporting ad-hoc
dev1path = adhoc_devices.pop()
adhoc_device = Device(adhoc_devices.pop())
# The same device is likely to have ap support too.
# But we can't start ad-hoc and ap on the same interface.
# Remove dev1 from ap_devices if it exists there
if dev1path in ap_devices:
ap_devices.remove(dev1path)
if adhoc_device.name in ap_devices:
ap_devices.remove(adhoc_device.name)
print("Working on ad-hoc")
dev1 = bus.get_proxy("net.connman.iwd", dev1path)
print("Starting ad-hoc on", dev1.Name)
if not dev1.Powered:
print("Device is off. Turning on")
dev1.Powered = True
if dev1.Mode != "ad-hoc":
print("Device is in", dev1.Mode)
print("Switching to ad-hoc")
dev1.Mode = "ad-hoc"
# Changing Mode needs connecting to the proxy again
dev1 = bus.get_proxy("net.connman.iwd", dev1path)
# If already connected to ad-hoc, stop it
if dev1.Started is True:
print("Already connected to ad-hoc. Stopping")
dev1.Stop()
# Reconnect to proxy or StartOpen won't work
dev1 = bus.get_proxy("net.connman.iwd", dev1path)
print("Starting ad-hoc network")
dev1.StartOpen(ADHOC_SSID)
adhoc_device.start_adhoc_open(ADHOC_SSID)
# Start Access point if ap_device is not empty,
# ie, we have more devices
if len(ap_devices) != 0:
print("Working on AP")
dev2path = ap_devices.pop()
dev2 = bus.get_proxy("net.connman.iwd", dev2path)
if not dev1.Powered:
print("Device is off. Turning on")
dev1.Powered = True
if dev2.Mode != "ap":
print(dev2.Name, "is in", dev2.Mode)
print("Switching to ap")
dev2.Mode = "ap"
dev2 = bus.get_proxy("net.connman.iwd", dev2path)
if dev2.Started is True:
print("An AP is already started on", dev2.Name)
print("Stopping")
dev2.Stop()
dev2 = bus.get_proxy("net.connman.iwd", dev2path)
print("Starting AP on", dev2.Name)
dev2.Start(AP_SSID, AP_PASSWD)
except DBusError:
ap_device = ap_devices.pop()
# _TODO: start ap after implementing in in iwd.py
except DBusError as e:
print(e)
sys.exit("An error occured while communicating with iwd")
print("Bye")