diff --git a/app.py b/app.py index 8302d91..71d0200 100644 --- a/app.py +++ b/app.py @@ -85,16 +85,32 @@ def start_gateway(reticulum): thread.start() -def _transport_settings_match(config_file, desired_host, desired_port): - """Check if existing config transport settings match desired values.""" +def _config_settings_match(config_file, desired_host, desired_port): + """Check if existing config transport and LoRa settings match desired values.""" import configparser try: config = configparser.ConfigParser() config.read(config_file) - if config.has_section("TCP Transport"): - existing_host = config.get("TCP Transport", "target_host") - existing_port = config.get("TCP Transport", "target_port") - return existing_host == desired_host and existing_port == str(desired_port) + # Check TCP transport + tcp_enabled = get_setting("tcp_enabled", "1") == "1" + has_tcp = config.has_section("TCP Transport") + if tcp_enabled != has_tcp: + return False + if tcp_enabled and has_tcp: + if (config.get("TCP Transport", "target_host") != desired_host or + config.get("TCP Transport", "target_port") != str(desired_port)): + return False + # Check LoRa + lora_enabled = get_setting("lora_enabled", "0") == "1" + has_lora = config.has_section("RNode LoRa") + if lora_enabled != has_lora: + return False + if lora_enabled and has_lora: + if config.get("RNode LoRa", "port", fallback="") != get_setting("lora_port", ""): + return False + if config.get("RNode LoRa", "frequency", fallback="") != get_setting("lora_frequency", "867200000"): + return False + return True except Exception: pass return False @@ -111,9 +127,41 @@ def ensure_rns_config(config_dir, transport_host=None, transport_port=None): transport_port = int(get_setting("transport_port", str(DEFAULT_TRANSPORT_PORT))) if os.path.exists(config_file): - if _transport_settings_match(config_file, transport_host, transport_port): + if _config_settings_match(config_file, transport_host, transport_port): return + # Build optional interface blocks + tcp_block = "" + if get_setting("tcp_enabled", "1") == "1": + tcp_block = f""" + [[TCP Transport]] + type = TCPClientInterface + enabled = yes + target_host = {transport_host} + target_port = {transport_port} +""" + + lora_block = "" + if get_setting("lora_enabled", "0") == "1": + lora_port = get_setting("lora_port", "") + if lora_port: + lora_frequency = get_setting("lora_frequency", "867200000") + lora_bandwidth = get_setting("lora_bandwidth", "125000") + lora_txpower = get_setting("lora_txpower", "7") + lora_sf = get_setting("lora_sf", "8") + lora_cr = get_setting("lora_cr", "5") + lora_block = f""" + [[RNode LoRa]] + type = RNodeInterface + enabled = yes + port = {lora_port} + frequency = {lora_frequency} + bandwidth = {lora_bandwidth} + txpower = {lora_txpower} + spreadingfactor = {lora_sf} + codingrate = {lora_cr} +""" + os.makedirs(config_dir, exist_ok=True) with open(config_file, "w") as f: f.write(f"""[reticulum] @@ -127,13 +175,7 @@ def ensure_rns_config(config_dir, transport_host=None, transport_port=None): [[Default Interface]] type = AutoInterface enabled = Yes - - [[TCP Transport]] - type = TCPClientInterface - enabled = yes - target_host = {transport_host} - target_port = {transport_port} -""") +{tcp_block}{lora_block}""") print(f"Created Reticulum config at {config_file}") diff --git a/handlers.py b/handlers.py index ab6864f..74f66b7 100644 --- a/handlers.py +++ b/handlers.py @@ -758,10 +758,23 @@ def handle_style_form(msg=""): reranker_checked = " checked" if reranker == "1" else "" disabled = "" if semantic == "1" else " disabled" dimmed = ' style="opacity:0.4"' if semantic != "1" else "" + tcp_enabled = get_setting("tcp_enabled", "1") + tcp_checked = " checked" if tcp_enabled == "1" else "" + tcp_disabled = "" if tcp_enabled == "1" else " disabled" transport_host = get_setting("transport_host", "reticulum.derickphan.com") transport_port = get_setting("transport_port", "4242") compress = get_setting("compress_embeddings", "0") compress_checked = " checked" if compress == "1" else "" + lora_enabled = get_setting("lora_enabled", "0") + lora_checked = " checked" if lora_enabled == "1" else "" + lora_disabled = "" if lora_enabled == "1" else " disabled" + lora_dimmed = ' style="opacity:0.4"' if lora_enabled != "1" else "" + lora_port = get_setting("lora_port", "") + lora_frequency = get_setting("lora_frequency", "867200000") + lora_bandwidth = get_setting("lora_bandwidth", "125000") + lora_txpower = get_setting("lora_txpower", "7") + lora_sf = get_setting("lora_sf", "8") + lora_cr = get_setting("lora_cr", "5") return _respond( f"

customize

" f"

name your search engine

" @@ -773,11 +786,43 @@ def handle_style_form(msg=""): f" share your site list publicly at /api/sites
" f"Note: pages tagged: private will not be shared.

" f"

mesh network

" - f"

Connect to a Reticulum transport node to reach other peers.

" + f"

Choose how to connect to the mesh. You can enable both for maximum reach.

" + f"

internet

" + f'
" + f"Reach peers anywhere online.
" + f'
' f"Default: reticulum.derickphan.com:4242
" - f'' - f'
' - f'

discover more nodes


' + f'' + f'
' + f'

discover more nodes

' + f'

' + f"

LoRa

" + f'
" + f"Reach nearby peers off-grid with an RNode.

" + f'
' + f'

' + f'
advanced radio settings' + f'
' + f'
' + f"ISM band frequency. Default: 867200000 (868 MHz EU). US: 915000000.

" + f'
' + f"Default: 125000

" + f'
' + f"0-17 typical. Check local regulations.

" + f'
' + f"5-12. Higher = longer range, slower speed.

" + f'
' + f"5-8. Higher = more error correction.
" + f'

' f"

search

" f"

ai

" f'