Fix for issue #25 #26

Merged
pranav merged 10 commits from fix-issue-25 into master 2021-12-02 15:13:32 +01:00
9 changed files with 103 additions and 31 deletions

View File

@ -1,5 +1,9 @@
# Changelog # Changelog
## [Unreleased][] - 2021-12-01
- Optimised auto gateway mode selection (#25)
## [v0.5.1][] - 2021-10-22 ## [v0.5.1][] - 2021-10-22
- Fixed stopping at boot when GNOME starts location service (#21) - Fixed stopping at boot when GNOME starts location service (#21)

View File

@ -2,41 +2,37 @@
Everyone can [hack][] naxalnet. See below for how to hack. Everyone can [hack][] naxalnet. See below for how to hack.
## Questions, answers and hate speech ## Questions and answers
Join the XMPP channel <xmpp:naxalnet@chat.disroot.org> to talk about Join the XMPP channel <xmpp:naxalnet@chat.disroot.org> to talk about
anything related to this program or about mesh networks in general. anything related to this program or about mesh networks in general.
Redirect your hate messages to `/dev/null`
## Reporting issues and suggesting ideas ## Reporting issues and suggesting ideas
To report a bug or suggest an idea, create a new issue at To report a bug or suggest an idea, create a new issue at
<https://git.disroot.org/pranav/naxalnet/issues> <https://git.disroot.org/pranav/naxalnet/issues>
While reporting a bug, you need to add the debug messages too. Run While reporting a bug, you can add the debug messages to provide more
`journalctl -fu naxalnet` on a terminal emulator (this could take some data. Run `journalctl -fu naxalnet` on a terminal emulator (this could
time). Now on another one, type `sudo systemctl start naxalnet.service` or take some time on some machines). Now on another one, type `sudo systemctl start naxalnet.service` or whatever caused the error. Now copy the error
whatever caused the error. Now copy the error messages and paste it in the messages and paste it in the issue body along with the description.
issue body along with the description.
## Improving documentation ## Improving documentation
The README and HACKING.md needs to be more beginner friendly. The README and HACKING.md needs to be more beginner friendly. See #20.
See #20.
## Contribute code ## Contribute code
To push to this repo, you need your username to be in the To push to this repo, you need your username to be in the contributors
contributors list. Add your username to issue #8 to add you list. Add your username to issue #8 to add you as a contributor. Before
as a contributor. Before each commit, update the CHANGELOG.md each commit, update the CHANGELOG.md and `__version__` in
and `__version__` in `naxalnet/__init__.py` `naxalnet/__init__.py`
## Packaging ## Packaging
Currently this program is only packaged for Arch Linux. Currently this program is only packaged for Arch Linux. naxalnet needs
naxalnet needs packages in GNU+Linux+systemd packages in GNU+Linux+systemd distributions such as Debian, Fedora,
distributions such as Debian, Fedora, openSUSE, openSUSE, and nixos. If you know/like to package it in your distro, post a
and nixos. If you know/like to package it in your distro, message to issue #6.
post a message to issue #6.
[hack]: https://catb.org/jargon/html/H/hack.html [hack]: https://catb.org/jargon/html/H/hack.html

View File

@ -136,7 +136,7 @@ uname -r
python3 --version python3 --version
# Check for IBSS (ad-hoc) support in your WiFi firmware or driver # Check for IBSS (ad-hoc) support in your WiFi firmware or driver
iw phy | grep -iq ibss && echo "IBSS is supported" || echo "IBSS not supported" iw phy | grep -q join_ibss && echo "IBSS is supported" || echo "IBSS not supported"
``` ```
Clone the naxalnet repo and cd into it. Clone the naxalnet repo and cd into it.
@ -300,8 +300,9 @@ systemd-networkd configures the network.
### Online class ### Online class
naxalnet can be used to share connections to join online classes. naxalnet can be used to share connections to join online classes. You need
You need at least one device with internet access if you are not using a program like [Jami][]. at least one device with internet access if you are not using a program
like [Jami][].
<!-- <!--

View File

@ -42,4 +42,4 @@ given below.
# #
# In case you forgot to change the version, skip the number # In case you forgot to change the version, skip the number
# and put the next number in the next commit. # and put the next number in the next commit.
__version__ = "0.5.1" __version__ = "0.5.1a1"

View File

@ -30,6 +30,7 @@ examples.
import subprocess import subprocess
from pathlib import Path from pathlib import Path
from dasbus.connection import SystemMessageBus from dasbus.connection import SystemMessageBus
from dasbus.loop import EventLoop, GLib
NETWORKD_BUS = "org.freedesktop.network1" NETWORKD_BUS = "org.freedesktop.network1"
@ -44,6 +45,7 @@ class NetworkD:
""" """
def __init__(self, runtime_dir="/run/systemd/network", bus=SystemMessageBus()): def __init__(self, runtime_dir="/run/systemd/network", bus=SystemMessageBus()):
print("NetworkD init")
self._bus = bus self._bus = bus
self.proxy_reload() self.proxy_reload()
@ -118,3 +120,68 @@ class NetworkD:
""" """
for i in self.runtime_path.iterdir(): for i in self.runtime_path.iterdir():
self.remove_config(i.name) self.remove_config(i.name)
class NetworkLoop(NetworkD):
"""Used to wait until a condition is met
Available methods:
NetworkLoop.wait_until_routable(timeout=0):
return true when the network is routable, or false when timed out
"""
def __init__(self, *args, **kwargs):
# first, initialise the parent object
super().__init__(*args, **kwargs)
self.waitfor = None
self.wait_function = None
self.loop = EventLoop()
def start_loop(self):
"""start the dasbus loop"""
self.proxy.PropertiesChanged.connect(self.on_properties_changed)
self.loop.run()
def wait_until_routable(self, timeout=0):
"""
Wait until timeout in milliseconds and returns True when any
network interface is shown routable by networkd. Does not wait
for timeout if timeout==0
"""
self.setup_timeout(timeout)
self.wait_for_change("AddressState", self.on_addressstate_change)
return self.is_routable()
def wait_for_change(self, name, function):
"""
Wait until the given property is changed and stop. If setup_timeout()
is called before calling this function, the loop stops after the timeout
or after the property is changed, whichever occurs first.
"""
self.waitfor = name
self.wait_function = function
self.start_loop()
def on_addressstate_change(self):
"""quit the loop if the network is routable"""
if self.is_routable():
self.loop.quit()
def on_properties_changed(self, bus_interface, data, blah):
"""called by dasbus everytime the configured property is changed"""
if self.waitfor in data:
return self.wait_function()
# Just to shut up pylint
return None
def setup_timeout(self, timeout):
"""setup a timeout"""
if timeout != 0:
GLib.timeout_add(timeout, self.on_timeout)
def on_timeout(self):
"""called by dasbus when a timeout occurs"""
self.loop.quit()

View File

@ -37,7 +37,7 @@ from naxalnet.log import logger
from naxalnet.iwd import Adapter, Device, IWD from naxalnet.iwd import Adapter, Device, IWD
from naxalnet.config import args from naxalnet.config import args
from naxalnet.daemon import Daemon from naxalnet.daemon import Daemon
from naxalnet.network import NetworkD from naxalnet.network import NetworkD, NetworkLoop
def get_sorted_glob(directory: str, glob: str) -> list: def get_sorted_glob(directory: str, glob: str) -> list:
@ -56,17 +56,15 @@ def get_sorted_glob(directory: str, glob: str) -> list:
def any_interface_is_routable(): def any_interface_is_routable():
"""returns true if any of the interfaces is routable""" """returns true if any of the interfaces is routable"""
networkd = NetworkD(runtime_dir=args.networkd_runtime_dir) networkd = NetworkLoop(runtime_dir=args.networkd_runtime_dir)
# First, add the temporary configs to networkd. # First, add the temporary configs to networkd.
for i in get_sorted_glob(args.networkd_config_dir, TMP_NET_GLOB): for i in get_sorted_glob(args.networkd_config_dir, TMP_NET_GLOB):
logger.debug("Adding temporary config %s", i) logger.debug("Adding temporary config %s", i)
networkd.add_config(i) networkd.add_config(i)
# Then, wait for some time to setup the network.
# This can probably be replaced by a d-bus wait-for-signal # timeout = 10 seconds
# function that timeouts after 10 seconds. routable = networkd.wait_until_routable(10 * 1000)
time.sleep(10)
routable = networkd.is_routable()
networkd.remove_all_configs() networkd.remove_all_configs()
return routable return routable
@ -246,8 +244,10 @@ def main():
notify("STATUS=Checking for internet") notify("STATUS=Checking for internet")
# If any interface is routable, set gateway mode to server # If any interface is routable, set gateway mode to server
if any_interface_is_routable(): if any_interface_is_routable():
logger.info("Network is routable. Setting gw_mode to server")
gateway_mode = "server" gateway_mode = "server"
else: else:
logger.info("Network is not routable. Setting gw_mode to client")
gateway_mode = "client" gateway_mode = "client"
logger.info("gateway_mode set to %s", gateway_mode) logger.info("gateway_mode set to %s", gateway_mode)
elif args.gateway_mode in ["server", "client", "off"]: elif args.gateway_mode in ["server", "client", "off"]:

View File

@ -1,3 +1,4 @@
[build-system] [build-system]
# I don't know what this means, I just copied it from some setuptools tutorial
requires = ["setuptools", "wheel"] requires = ["setuptools", "wheel"]
build-backend = "setuptools.build_meta" build-backend = "setuptools.build_meta"

View File

@ -1,4 +1,7 @@
# This program is not meant to be distributed through PyPi # This file is loosely based on the setup.cfg used in django.
# naxalnet is not meant to be distributed through PyPi. This program uses
# a systemd service, and some other files whose path is hardcoded into the
# module.
[metadata] [metadata]
name = naxalnet name = naxalnet
version = attr: naxalnet.__version__ version = attr: naxalnet.__version__
@ -33,7 +36,7 @@ console_scripts =
[options.data_files] [options.data_files]
lib/systemd/system = lib/systemd/system =
service/naxalnet.service naxalnet.service
# If installing with pip, this file will be copied to some other place. # If installing with pip, this file will be copied to some other place.
# This is the reason we use setup.py instead of pip in the Makefile. # This is the reason we use setup.py instead of pip in the Makefile.
/etc/naxalnet = /etc/naxalnet =