#!/usr/bin/env python3 """ Setup a working BATMAN Advanced network with systemd-networkd and iwd """ # Copyright (C) 2021 The 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 . import sys from pathlib import Path from shutil import copy from dasbus.connection import SystemMessageBus NETWORKD_CONFIGS = "/usr/share/naxalnet/networkd" NETWORKD_VOLATILE_DIR = "/run/systemd/network" RESOLVED_STUB_RESOLVE = "/run/systemd/resolve/stub-resolv.conf" RESOLV_CONF = "/etc/resolv.conf" ADHOC_SSID = "HelloWorld" # Copy networkd configs to volatile dir. # See man:systemd.networkm(5) try: 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) except PermissionError as e: print(e) sys.exit("Make sure you are root") # Symlink resolvd.conf to systemd's stub-resolvd.conf # This is needed for DNS resolution to work. # see https://wiki.archlinux.org/title/Systemd-resolved#DNS try: print("Checking resolv.conf") r = Path(RESOLV_CONF) if r.exists(): print(r, "already exists. Removing it") r.unlink() print("Linking resolv.conf") r.symlink_to(RESOLVED_STUB_RESOLVE) except PermissionError as e: print(e) sys.exit("An error occured while linking resolv.conf") # 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 = [] for name, obj in objects.items(): if "net.connman.iwd.Device" in obj: # add all devices to the list print("Found device:", obj["net.connman.iwd.Device"]["Name"]) devices.append(name) # Start ad-hoc on first device devpath = devices.pop() print("Working on first device", devpath) dev1 = bus.get_proxy("net.connman.iwd", devpath) if not dev1.Powered: print("Device is off. Turning on") dev1.Powered = True print("Device is in", dev1.Mode) dev1.Mode = "ad-hoc" print("Switched to", dev1.Mode) print("Starting ad-hoc network") dev1.StartOpen(ADHOC_SSID) # TODO: If there is a second device, start AP # in it except: sys.exit("An error occured while communicating with iwd") # Sleep my little baby-oh # Sleep until you waken # When you wake you'll see the world # If I'm not mistaken... # # Kiss a lover # Dance a measure, # Find your name # And buried treasure... # # Face your life # Its pain, # Its pleasure, # Leave no path untaken. # # -- Neil Gaiman, The Graveyard Book print("Bye")