#!/usr/bin/env python3 # Copyright (C) 2021 The naxalnet Authors # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . """ Setup a working BATMAN Advanced network with systemd-networkd and iwd """ import sys from pathlib import Path from shutil import copy from dasbus.error import DBusError from naxalnet.iwd import IWD, Device, Adapter NETWORKD_CONFIGS = "/usr/share/naxalnet/networkd" NETWORKD_VOLATILE_DIR = "/run/systemd/network" ADHOC_SSID = "HelloWorld" AP_SSID = "NaxalNet" AP_PASSWD = "naxalnet256" def copy_files(): """ Copy networkd configs to volatile dir. The D-Bus API does not support creating new interfaces or linking to bridges. So we use config files. See man:systemd.network(5) """ print("Copying network config files") dest = Path(NETWORKD_VOLATILE_DIR) src = Path(NETWORKD_CONFIGS) # Create the volatile directory if it doesn't exist dest.mkdir(parents=True, exist_ok=True) # Copy all files in src to dest for i in src.iterdir(): copy(i, dest) def here_be_dragons(): """ This function is run every time you execute naxalnet from commandline """ try: copy_files() except PermissionError as error: print(error) sys.exit("Make sure you are root") # Now, the iwd part try: iwd = IWD() devices = iwd.get_devices() adhoc_devices = [] ap_devices = [] for i in devices: device = Device(i) adapter = Adapter(device.adapter) if adapter.supports_mode("ad-hoc"): adhoc_devices.append(i) if adapter.supports_mode("ap"): ap_devices.append(i) if len(adhoc_devices) != 0: # Start ad-hoc on first device supporting ad-hoc 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 adhoc_device from ap_devices if it exists there if adhoc_device.name in ap_devices: ap_devices.remove(adhoc_device.name) print("Working on ad-hoc") # Turn on adapter if it is off # See issue #9 adhoc_adapter = Adapter(adhoc_device.adapter) if not adhoc_adapter.is_powered_on(): adhoc_adapter.power_on() adhoc_device.reload() 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") ap_device = Device(ap_devices.pop()) # Turn on adapter if it is off # See issue #9 ap_adapter = Adapter(ap_device.adapter) if not ap_adapter.is_powered_on(): ap_adapter.power_on() ap_adapter.reload() ap_device.start_ap(AP_SSID, AP_PASSWD) except DBusError as error: print(error) sys.exit("An error occured while communicating with iwd") # naxalnet will print Bye if no errors occured print("Bye")