diff --git a/Makefile b/Makefile index 04482a8..b8dfece 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,14 @@ PREFIX := /usr install: naxalnet install -d $(DESTDIR)$(PREFIX)/bin install -d $(DESTDIR)$(PREFIX)/lib/systemd/system/ - install naxalnet@.service $(DESTDIR)$(PREFIX)/lib/systemd/system/ + install -m644 naxalnet.service $(DESTDIR)$(PREFIX)/lib/systemd/system/ install naxalnet $(DESTDIR)$(PREFIX)/bin/ - install -d $(DESTDIR)$(PREFIX)/share/naxalnet - install systemd-networkd/* $(DESTDIR)$(PREFIX)/share/naxalnet/ + install -d $(DESTDIR)$(PREFIX)/share/naxalnet/networkd + install -m644 systemd-networkd/* $(DESTDIR)$(PREFIX)/share/naxalnet/networkd + +testdeps: + @for i in networkctl systemctl python3; do \ + echo "Checking for $$i"; \ + which $$i > /dev/null && echo " $$i found" || \ + (echo " $$i not found"; exit 1); \ + done diff --git a/README.md b/README.md index c2b5ae4..a05743d 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,27 @@ # naxalnet -Naxalnet is an experiment to create an intranet and use it for -communicating with each other during an internet shutdown. It tries to use +**naxalnet** is an experiment to create a wireless mesh network for +communicating with each other during an internet shutdown, using existing software and tech as much as possible. Currently -you can only communicate with other peers running the same software. +you can only communicate with other peers running naxalnet or +using the same network as naxalnet. It uses +[B.A.T.M.A.N. Advanced](https://www.open-mesh.org/projects/batman-adv/wiki), +an implementation of the B.A.T.M.A.N. routing protocol to +communicate with peers. The name naxal comes from Naxalbari, a village in Darjeeling, West Bengal. -A rewrite in python is in progress in the branch python-rewrite. +This is the ongoing python rewrite branch, which uses +[dasbus](https://github.com/rhinstaller/dasbus) to communicate +with iwd. + +## License + +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. + +See [LICENSE.md](LICENSE.md) for the complete version of the +license. ## TODO @@ -101,4 +118,4 @@ sudo rm -r /usr/local/{bin/naxalnet,share/naxalnet/,lib/systemd/system/naxalnet@ Add list of things here. -This project is in pre-alpha stage. Documentation is incomplete. \ No newline at end of file +This project is in alpha stage. Documentation is incomplete. diff --git a/naxalnet b/naxalnet index c333bdd..9e318b1 100755 --- a/naxalnet +++ b/naxalnet @@ -1,35 +1,118 @@ -#!/usr/bin/env bash +#!/usr/bin/env python3 -DATADIR="$(dirname "$0")/../share/naxalnet" -NETWORKD_DIR=/run/systemd/network -SSID="Hello World" +""" +Setup a working BATMAN Advanced network +with systemd-networkd and iwd +""" -if [[ $# != 1 ]] -then - echo "Usage: $0 {wireless device}" - echo "Example: $0 wlan0" - exit 1 -fi +# Copyright (C) 2021 The Authors -if [[ ! -d "$NETWORKD_DIR" ]] -then - mkdir "$NETWORKD_DIR" -fi +# 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. -echo "Copying systemd-networkd config files" -# Copies all files in DATADIR to NETWORKD_DIR -find "$DATADIR" -type f -execdir cp -t "$NETWORKD_DIR" {} + +# 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. -echo "Linking resolv.conf to systemd-resolved's stub-resolved.conf" -ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . -echo "Starting services" -systemctl reload-or-restart iwd systemd-resolved systemd-networkd -# wait five seconds for iwd to start -#sleep 5 -echo "Configuring iwd" -iwctl device "$1" set-property Mode ad-hoc -iwctl ad-hoc "$1" start_open "$SSID" +import sys +from pathlib import Path +from shutil import copy +from dasbus.connection import SystemMessageBus -echo "Done" +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") diff --git a/naxalnet.service b/naxalnet.service new file mode 100644 index 0000000..339c3ed --- /dev/null +++ b/naxalnet.service @@ -0,0 +1,21 @@ +[Unit] +Description=Naxalnet +Requires=systemd-networkd.service +Requires=iwd.service +Wants=systemd-resolved.service +Before=systemd-networkd.service +After=iwd.service + +# Stops NetworkManager and wpa_supplicant if already running +Conflicts=NetworkManager.service +Conflicts=wpa_supplicant.service +After=NetworkManager.service +After=wpa_supplicant.service + +[Service] +Type=oneshot +RemainAfterExit=yes +ExecStart=/usr/bin/naxalnet + +[Install] +WantedBy=multi-user.target diff --git a/naxalnet@.service b/naxalnet@.service deleted file mode 100644 index 3380768..0000000 --- a/naxalnet@.service +++ /dev/null @@ -1,10 +0,0 @@ -[Unit] -Description=Naxalnet on %i - -[Service] -Type=oneshot -RemainAfterExit=yes -ExecStart=/usr/bin/naxalnet %i - -[Install] -WantedBy=multi-user.target diff --git a/systemd-networkd/07-eth.network b/systemd-networkd/07-eth.network new file mode 100644 index 0000000..406ab0d --- /dev/null +++ b/systemd-networkd/07-eth.network @@ -0,0 +1,5 @@ +[Match] +Name=en* + +[Network] +Bridge=bridge0