diff --git a/src/lan/__init__.py b/src/lan/__init__.py index 621940c4..32274644 100644 --- a/src/lan/__init__.py +++ b/src/lan/__init__.py @@ -31,8 +31,11 @@ class LANManager: def __init__(self, too_many: "TooMany"): self.too_many = too_many + self.peers: "exploded IP Address string" = set() + def start(self): Thread(target=learn_services, daemon=True).start() Thread(target=advertise_service, daemon=True).start() + Thread(tra) diff --git a/src/lan/discover.py b/src/lan/discover.py index 7d5435de..06ec06d7 100644 --- a/src/lan/discover.py +++ b/src/lan/discover.py @@ -4,6 +4,10 @@ Discover and publish private-network """ import socket import struct +from typing import TYPE_CHECKING +from typing import List +from ipaddress import ip_address +from socket import SHUT_RDWR from .getip import lan_ips from utils.bettersleep import better_sleep @@ -27,7 +31,10 @@ IS_ALL_GROUPS = True ANNOUNCE_LOOP_SLEEP = 30 -def learn_services(): + +def learn_services(lan_service_list: List): + """Take a list to infintely add lan service info to.""" + sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) if IS_ALL_GROUPS: @@ -41,11 +48,26 @@ def learn_services(): sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) while True: - rec_data = sock.recv(1024) - print('reced_data', rec_data) + service_ips = sock.recv(200).decode('utf-8') + if 'onionr' not in service_ips: + continue + service_ips = service_ips.replace('onionr-', '').split('-') + port = 0 + for service in service_ips: + try: + ip_address(service) + except ValueError: + service_ips.remove(service) + continue + # remove our own ips + service_ips = set(lan_ips) ^ set(service_ips) + # remove known ips and add to external list + lan_service_list = set(service_ips) ^ set(lan_service_list) - sock.shutdown() + + sock.shutdown(SHUT_RDWR) sock.close() + # no return intended, list modified by reference def advertise_service(): @@ -61,5 +83,5 @@ def advertise_service(): while True: sock.sendto(f"onionr-{ips}".encode('utf-8'), (MCAST_GRP, MCAST_PORT)) better_sleep(ANNOUNCE_LOOP_SLEEP) - sock.shutdown() + sock.shutdown(SHUT_RDWR) sock.close() diff --git a/src/lan/server/__init__.py b/src/lan/server/__init__.py index 4d5b4796..f6a89673 100644 --- a/src/lan/server/__init__.py +++ b/src/lan/server/__init__.py @@ -2,6 +2,8 @@ LAN transport server thread """ +from gevent.pywsgi import WSGIServer +from flask import Flask """ 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 @@ -16,3 +18,16 @@ LAN transport server thread You should have received a copy of the GNU General Public License along with this program. If not, see . """ + + +class LANServer: + def __init__(self, shared_state): + app = Flask(__name__) + self.app = app + + @app.route("/") + def ping(): + return "pong!" + + def start_server(): + return diff --git a/tests/integration-tests/test_lan_discover.py b/tests/integration-tests/test_lan_discover.py deleted file mode 100644 index ad98e2a9..00000000 --- a/tests/integration-tests/test_lan_discover.py +++ /dev/null @@ -1,35 +0,0 @@ -from unittest.mock import patch -import sys, os -sys.path.append(".") -sys.path.append("src/") -import unittest, uuid -TEST_DIR = 'testdata/%s-%s' % (uuid.uuid4(), os.path.basename(__file__)) + '/' -print("Test directory:", TEST_DIR) -os.environ["ONIONR_HOME"] = TEST_DIR -from utils import createdirs -from onionrcommands import parser -import onionrsetup as setup -from netcontroller.torcontrol import customtorrc -from utils import createdirs -from onionrsetup import setup_config, setup_default_plugins -from coredb import blockmetadb -from etc.onionrvalues import BLOCK_EXPORT_FILE_EXT -from threading import Thread - -createdirs.create_dirs() -setup_config() -setup_default_plugins() -import config -from filepaths import export_location - -class OnionrTests(unittest.TestCase): - def test_lan_discover(self): - testargs = ['onionr.py', 'start'] - with patch.object(sys, 'argv', testargs): - try: - Thread(target=parser.register, daemon=True).start() - except SystemExit: - pass - - -unittest.main() diff --git a/tests/test_lan_learn.py b/tests/test_lan_learn.py new file mode 100644 index 00000000..25816ef7 --- /dev/null +++ b/tests/test_lan_learn.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python3 +import sys, os +sys.path.append(".") +sys.path.append("src/") +import uuid +from threading import Thread +TEST_DIR = 'testdata/%s-%s' % (uuid.uuid4(), os.path.basename(__file__)) + '/' +print("Test directory:", TEST_DIR) +os.environ["ONIONR_HOME"] = TEST_DIR +import unittest, json + +from utils import identifyhome, createdirs +from onionrsetup import setup_config +createdirs.create_dirs() +setup_config() +from utils import bettersleep +from lan.discover import lan_ips, MCAST_GRP, MCAST_PORT +from lan.discover import learn_services, advertise_service +import socket +from socket import SHUT_RDWR +lan_ips = [''] + + +class TestLanLearn(unittest.TestCase): + def test_lan_learn(self): + test_ip = '192.168.1.30' + def multicast(): + port = 1349 + MULTICAST_TTL = 3 + ips = '-'.join([test_ip]) + f'-{port}' + + sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) + sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, MULTICAST_TTL) + sock.sendto(f"onionr-{ips}".encode('utf-8'), (MCAST_GRP, MCAST_PORT)) + bettersleep.better_sleep(1) + try: + sock.shutdown(SHUT_RDWR) + except OSError: + pass + sock.close() + test_list = [test_ip] + + Thread(target=learn_services, args=[test_list], daemon=True).start() + bettersleep.better_sleep(3) + multicast() + self.assertIn(test_ip, test_list) + +unittest.main()