Fix RNS initialization and reload logic in app.py
- Introduced a dedicated storage initialization process for Reticulum. - More error handling and logging during RNS initialization and reload. - Updated the reload_reticulum function to support asynchronous execution. - Modified settings.py to handle reload operations with improved user feedback.
This commit is contained in:
@@ -50,10 +50,77 @@ async def main(page: Page):
|
|||||||
page.add(loader)
|
page.add(loader)
|
||||||
page.update()
|
page.update()
|
||||||
|
|
||||||
def init_ret():
|
# Initialize storage system
|
||||||
import time
|
storage = initialize_storage(page)
|
||||||
|
|
||||||
time.sleep(0.5)
|
# Get Reticulum config directory from storage manager
|
||||||
|
config_dir = storage.get_reticulum_config_path()
|
||||||
|
|
||||||
|
# Update the global RNS_CONFIG_DIR so RNS uses the right path
|
||||||
|
global RNS_CONFIG_DIR
|
||||||
|
RNS_CONFIG_DIR = str(config_dir)
|
||||||
|
|
||||||
|
# Ensure any saved config is written to filesystem before RNS init
|
||||||
|
try:
|
||||||
|
saved_config = storage.load_config()
|
||||||
|
if saved_config and saved_config.strip():
|
||||||
|
config_file_path = config_dir / "config"
|
||||||
|
config_file_path.parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
config_file_path.write_text(saved_config, encoding="utf-8")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Warning: Failed to write config file: {e}")
|
||||||
|
|
||||||
|
print(f"Initializing RNS with config directory: {config_dir}")
|
||||||
|
print(f"Config directory exists: {config_dir.exists()}")
|
||||||
|
print(f"Config directory is writable: {config_dir.is_dir() if config_dir.exists() else 'N/A'}")
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Set up logging capture first, before RNS init
|
||||||
|
import ren_browser.logs
|
||||||
|
|
||||||
|
ren_browser.logs.setup_rns_logging()
|
||||||
|
global RNS_INSTANCE
|
||||||
|
RNS_INSTANCE = RNS.Reticulum(str(config_dir))
|
||||||
|
print("RNS initialized successfully")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error initializing Reticulum: {e}")
|
||||||
|
print(f"Config directory: {config_dir}")
|
||||||
|
import traceback
|
||||||
|
traceback.print_exc()
|
||||||
|
|
||||||
|
page.controls.clear()
|
||||||
|
build_ui(page)
|
||||||
|
page.update()
|
||||||
|
|
||||||
|
|
||||||
|
async def reload_reticulum(page: Page, on_complete=None):
|
||||||
|
"""Hot reload Reticulum with updated configuration.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
page: Flet page instance
|
||||||
|
on_complete: Optional callback to run when reload is complete
|
||||||
|
|
||||||
|
"""
|
||||||
|
import asyncio
|
||||||
|
|
||||||
|
try:
|
||||||
|
global RNS_INSTANCE
|
||||||
|
|
||||||
|
if RNS_INSTANCE:
|
||||||
|
try:
|
||||||
|
RNS_INSTANCE.exit_handler()
|
||||||
|
print("RNS exit handler completed")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Warning during RNS shutdown: {e}")
|
||||||
|
|
||||||
|
RNS.Reticulum._Reticulum__instance = None
|
||||||
|
|
||||||
|
RNS.Transport.destinations = []
|
||||||
|
|
||||||
|
RNS_INSTANCE = None
|
||||||
|
print("RNS instance cleared")
|
||||||
|
|
||||||
|
await asyncio.sleep(0.5)
|
||||||
|
|
||||||
# Initialize storage system
|
# Initialize storage system
|
||||||
storage = initialize_storage(page)
|
storage = initialize_storage(page)
|
||||||
@@ -61,10 +128,6 @@ async def main(page: Page):
|
|||||||
# Get Reticulum config directory from storage manager
|
# Get Reticulum config directory from storage manager
|
||||||
config_dir = storage.get_reticulum_config_path()
|
config_dir = storage.get_reticulum_config_path()
|
||||||
|
|
||||||
# Update the global RNS_CONFIG_DIR so RNS uses the right path
|
|
||||||
global RNS_CONFIG_DIR
|
|
||||||
RNS_CONFIG_DIR = str(config_dir)
|
|
||||||
|
|
||||||
# Ensure any saved config is written to filesystem before RNS init
|
# Ensure any saved config is written to filesystem before RNS init
|
||||||
try:
|
try:
|
||||||
saved_config = storage.load_config()
|
saved_config = storage.load_config()
|
||||||
@@ -75,99 +138,26 @@ async def main(page: Page):
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Warning: Failed to write config file: {e}")
|
print(f"Warning: Failed to write config file: {e}")
|
||||||
|
|
||||||
print(f"Initializing RNS with config directory: {config_dir}")
|
|
||||||
print(f"Config directory exists: {config_dir.exists()}")
|
|
||||||
print(f"Config directory is writable: {config_dir.is_dir() if config_dir.exists() else 'N/A'}")
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# Set up logging capture first, before RNS init
|
# Re-initialize Reticulum
|
||||||
import ren_browser.logs
|
import ren_browser.logs
|
||||||
|
|
||||||
ren_browser.logs.setup_rns_logging()
|
ren_browser.logs.setup_rns_logging()
|
||||||
global RNS_INSTANCE
|
|
||||||
RNS_INSTANCE = RNS.Reticulum(str(config_dir))
|
RNS_INSTANCE = RNS.Reticulum(str(config_dir))
|
||||||
print("RNS initialized successfully")
|
|
||||||
except Exception as e:
|
|
||||||
print(f"Error initializing Reticulum: {e}")
|
|
||||||
print(f"Config directory: {config_dir}")
|
|
||||||
import traceback
|
|
||||||
traceback.print_exc()
|
|
||||||
page.controls.clear()
|
|
||||||
build_ui(page)
|
|
||||||
page.update()
|
|
||||||
|
|
||||||
page.run_thread(init_ret)
|
# Success
|
||||||
|
if on_complete:
|
||||||
|
on_complete(True, None)
|
||||||
def reload_reticulum(page: Page, on_complete=None):
|
|
||||||
"""Hot reload Reticulum with updated configuration.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
page: Flet page instance
|
|
||||||
on_complete: Optional callback to run when reload is complete
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
def reload_thread():
|
|
||||||
import time
|
|
||||||
|
|
||||||
try:
|
|
||||||
global RNS_INSTANCE
|
|
||||||
|
|
||||||
if RNS_INSTANCE:
|
|
||||||
try:
|
|
||||||
RNS_INSTANCE.exit_handler()
|
|
||||||
print("RNS exit handler completed")
|
|
||||||
except Exception as e:
|
|
||||||
print(f"Warning during RNS shutdown: {e}")
|
|
||||||
|
|
||||||
RNS.Reticulum._Reticulum__instance = None
|
|
||||||
|
|
||||||
RNS.Transport.destinations = []
|
|
||||||
|
|
||||||
RNS_INSTANCE = None
|
|
||||||
print("RNS instance cleared")
|
|
||||||
|
|
||||||
time.sleep(0.5)
|
|
||||||
|
|
||||||
# Initialize storage system
|
|
||||||
storage = initialize_storage(page)
|
|
||||||
|
|
||||||
# Get Reticulum config directory from storage manager
|
|
||||||
config_dir = storage.get_reticulum_config_path()
|
|
||||||
|
|
||||||
# Ensure any saved config is written to filesystem before RNS init
|
|
||||||
try:
|
|
||||||
saved_config = storage.load_config()
|
|
||||||
if saved_config and saved_config.strip():
|
|
||||||
config_file_path = config_dir / "config"
|
|
||||||
config_file_path.parent.mkdir(parents=True, exist_ok=True)
|
|
||||||
config_file_path.write_text(saved_config, encoding="utf-8")
|
|
||||||
except Exception as e:
|
|
||||||
print(f"Warning: Failed to write config file: {e}")
|
|
||||||
|
|
||||||
try:
|
|
||||||
# Re-initialize Reticulum
|
|
||||||
import ren_browser.logs
|
|
||||||
|
|
||||||
ren_browser.logs.setup_rns_logging()
|
|
||||||
RNS_INSTANCE = RNS.Reticulum(str(config_dir))
|
|
||||||
|
|
||||||
# Success
|
|
||||||
if on_complete:
|
|
||||||
on_complete(True, None)
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
print(f"Error reinitializing Reticulum: {e}")
|
|
||||||
if on_complete:
|
|
||||||
on_complete(False, str(e))
|
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Error during reload: {e}")
|
print(f"Error reinitializing Reticulum: {e}")
|
||||||
if on_complete:
|
if on_complete:
|
||||||
on_complete(False, str(e))
|
on_complete(False, str(e))
|
||||||
|
|
||||||
page.run_thread(reload_thread)
|
except Exception as e:
|
||||||
|
print(f"Error during reload: {e}")
|
||||||
|
if on_complete:
|
||||||
|
on_complete(False, str(e))
|
||||||
|
|
||||||
|
|
||||||
def run():
|
def run():
|
||||||
|
|||||||
@@ -170,6 +170,34 @@ def open_settings_tab(page: ft.Page, tab_manager):
|
|||||||
loading_snack.open = True
|
loading_snack.open = True
|
||||||
page.update()
|
page.update()
|
||||||
|
|
||||||
|
async def do_reload():
|
||||||
|
import ren_browser.app as app_module
|
||||||
|
|
||||||
|
try:
|
||||||
|
await app_module.reload_reticulum(page, on_reload_complete)
|
||||||
|
except Exception as e:
|
||||||
|
loading_snack.open = False
|
||||||
|
page.update()
|
||||||
|
|
||||||
|
snack = ft.SnackBar(
|
||||||
|
content=ft.Row(
|
||||||
|
controls=[
|
||||||
|
ft.Icon(
|
||||||
|
ft.Icons.ERROR, color=ft.Colors.RED_400, size=20
|
||||||
|
),
|
||||||
|
ft.Text(
|
||||||
|
f"Reload failed: {str(e)}", color=ft.Colors.WHITE
|
||||||
|
),
|
||||||
|
],
|
||||||
|
tight=True,
|
||||||
|
),
|
||||||
|
bgcolor=ft.Colors.RED_900,
|
||||||
|
duration=4000,
|
||||||
|
)
|
||||||
|
page.overlay.append(snack)
|
||||||
|
snack.open = True
|
||||||
|
page.update()
|
||||||
|
|
||||||
def on_reload_complete(success, error):
|
def on_reload_complete(success, error):
|
||||||
loading_snack.open = False
|
loading_snack.open = False
|
||||||
page.update()
|
page.update()
|
||||||
@@ -213,9 +241,7 @@ def open_settings_tab(page: ft.Page, tab_manager):
|
|||||||
snack.open = True
|
snack.open = True
|
||||||
page.update()
|
page.update()
|
||||||
|
|
||||||
import ren_browser.app as app_module
|
page.run_task(do_reload)
|
||||||
|
|
||||||
app_module.reload_reticulum(page, on_reload_complete)
|
|
||||||
|
|
||||||
except Exception as ex:
|
except Exception as ex:
|
||||||
snack = ft.SnackBar(
|
snack = ft.SnackBar(
|
||||||
|
|||||||
Reference in New Issue
Block a user