temporary fix for #25

Uses multithreading.Process instead of GLib.timeout_add()

The moment I finished writing this part, I found out the only problem
with my previous commit was that I had setup the timeout _after_ calling
the blocking function wait_for_change instead of before it.

Although this version (with Process) works, I'm reverting to the
previous version and swapping the two lines (which I had tested and
found to work)

And in case you have read upto the previous line you should also know I
fixed some code in the README

TL;DR: I have proven once again I am an idiot
This commit is contained in:
Pranav Jerry 2021-11-29 14:36:59 +05:30
parent d7a84d8ccc
commit 5e58df0b71
No known key found for this signature in database
GPG Key ID: F1DCDC4FED0A0C5B
6 changed files with 31 additions and 18 deletions

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.1a0.dev5" __version__ = "0.5.1a0.dev6"

View File

@ -28,9 +28,10 @@ examples.
""" """
import subprocess import subprocess
from multiprocessing import Process
from pathlib import Path from pathlib import Path
from dasbus.connection import SystemMessageBus from dasbus.connection import SystemMessageBus
from dasbus.loop import EventLoop, GLib from dasbus.loop import EventLoop
NETWORKD_BUS = "org.freedesktop.network1" NETWORKD_BUS = "org.freedesktop.network1"
@ -142,6 +143,7 @@ class NetworkLoop(NetworkD):
self.waitfor = None self.waitfor = None
self.wait_function = None self.wait_function = None
self.loop = EventLoop() self.loop = EventLoop()
self.timeout = 0
def start_loop(self): def start_loop(self):
"""start the dasbus loop""" """start the dasbus loop"""
@ -149,17 +151,30 @@ class NetworkLoop(NetworkD):
print("waitfor", self.waitfor) print("waitfor", self.waitfor)
print("waitfor func", self.wait_function) print("waitfor func", self.wait_function)
self.proxy.PropertiesChanged.connect(self.on_properties_changed) self.proxy.PropertiesChanged.connect(self.on_properties_changed)
self.loop.run() process = Process(target=self.loop.run)
process.start()
# wait until timeout
if self.timeout != 0:
process.join(self.timeout)
else:
process.join()
# When the process is timed out, it is not killed. We have to kill
# it manually
if process.is_alive():
self.on_timeout()
def wait_until_routable(self, timeout=0): def wait_until_routable(self, timeout=0):
""" """
Wait until timeout in milliseconds and returns True when any Wait until timeout in seconds and returns True when any
network interface is shown routable by networkd. Does not wait network interface is shown routable by networkd. Does not wait
for timeout if timeout==0 for timeout if timeout==0
""" """
print("wait until routable") print("wait until routable")
self.timeout = timeout
self.wait_for_change("AddressState", self.on_addressstate_change) self.wait_for_change("AddressState", self.on_addressstate_change)
self.setup_timeout(timeout)
return self.is_routable() return self.is_routable()
def wait_for_change(self, name, function): def wait_for_change(self, name, function):
@ -181,13 +196,7 @@ class NetworkLoop(NetworkD):
if self.waitfor in data: if self.waitfor in data:
return self.wait_function() return self.wait_function()
def setup_timeout(self, timeout):
"""setup a timeout"""
print("setup timeout")
if timeout != 0:
GLib.timeout_add(timeout, self.on_timeout)
def on_timeout(self): def on_timeout(self):
"""called by dasbus when a timeout occurs""" """called when a timeout occurs"""
print("on timeout") print("on timeout")
self.loop.quit() self.loop.quit()

View File

@ -63,8 +63,7 @@ def any_interface_is_routable():
logger.debug("Adding temporary config %s", i) logger.debug("Adding temporary config %s", i)
networkd.add_config(i) networkd.add_config(i)
# timeout = 10 seconds routable = networkd.wait_until_routable(timeout=10)
routable = networkd.wait_until_routable(10 * 1000)
networkd.remove_all_configs() networkd.remove_all_configs()
return routable return routable

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__