Added advanced RNS configuration and multiple interfaces support
This commit is contained in:
parent
b301dc569b
commit
c210754aa4
|
@ -172,6 +172,7 @@ class SidebandCore():
|
||||||
self.owner_service = owner_service
|
self.owner_service = owner_service
|
||||||
self.allow_service_dispatch = True
|
self.allow_service_dispatch = True
|
||||||
self.version_str = ""
|
self.version_str = ""
|
||||||
|
self.config_template = rns_config
|
||||||
|
|
||||||
if config_path == None:
|
if config_path == None:
|
||||||
self.app_dir = plyer.storagepath.get_home_dir()+"/.config/sideband"
|
self.app_dir = plyer.storagepath.get_home_dir()+"/.config/sideband"
|
||||||
|
@ -276,6 +277,29 @@ class SidebandCore():
|
||||||
if load_config_only:
|
if load_config_only:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
if RNS.vendor.platformutils.is_android():
|
||||||
|
if self.config["config_template"] != None:
|
||||||
|
try:
|
||||||
|
if not os.path.isfile(self.rns_configdir+"/config_template_invalid"):
|
||||||
|
if self.is_service:
|
||||||
|
with open(self.rns_configdir+"/config_template_invalid", "w") as invalidation_file:
|
||||||
|
invalidation_file.write("\n")
|
||||||
|
|
||||||
|
ct = self.config["config_template"]
|
||||||
|
RNS.log(f"Loading modified RNS config template", RNS.LOG_WARNING)
|
||||||
|
self.config_template = ct
|
||||||
|
|
||||||
|
else:
|
||||||
|
RNS.log("Custom configuration template invalid, using default configuration template", RNS.LOG_WARNING)
|
||||||
|
self.config_template = rns_config
|
||||||
|
if self.is_service:
|
||||||
|
self.setstate("hardware_operation.error", "At the previous start, Sideband could not initialise Reticulum. Custom configuration template loading has been temporarily disabled. Please check and fix any errors in your configuration template.")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
RNS.log(f"An error occurred while setting RNS configuration template: {e}", RNS.LOG_ERROR)
|
||||||
|
RNS.log(f"Using default configuration template", RNS.LOG_ERROR)
|
||||||
|
self.config_template = rns_config
|
||||||
|
|
||||||
# Initialise Reticulum configuration
|
# Initialise Reticulum configuration
|
||||||
if RNS.vendor.platformutils.get_platform() == "android":
|
if RNS.vendor.platformutils.get_platform() == "android":
|
||||||
try:
|
try:
|
||||||
|
@ -286,11 +310,10 @@ class SidebandCore():
|
||||||
RNS.log("Configuring Reticulum instance...")
|
RNS.log("Configuring Reticulum instance...")
|
||||||
if self.config["connect_transport"]:
|
if self.config["connect_transport"]:
|
||||||
RNS.log("Enabling Reticulum Transport")
|
RNS.log("Enabling Reticulum Transport")
|
||||||
generated_config = rns_config.replace("TRANSPORT_IS_ENABLED", "Yes")
|
generated_config = self.config_template.replace("TRANSPORT_IS_ENABLED", "Yes")
|
||||||
else:
|
else:
|
||||||
RNS.log("Not enabling Reticulum Transport")
|
RNS.log("Not enabling Reticulum Transport")
|
||||||
generated_config = rns_config.replace("TRANSPORT_IS_ENABLED", "No")
|
generated_config = self.config_template.replace("TRANSPORT_IS_ENABLED", "No")
|
||||||
|
|
||||||
|
|
||||||
config_file = open(self.rns_configdir+"/config", "wb")
|
config_file = open(self.rns_configdir+"/config", "wb")
|
||||||
config_file.write(generated_config.encode("utf-8"))
|
config_file.write(generated_config.encode("utf-8"))
|
||||||
|
@ -567,6 +590,8 @@ class SidebandCore():
|
||||||
if not "block_predictive_text" in self.config:
|
if not "block_predictive_text" in self.config:
|
||||||
self.config["block_predictive_text"] = False
|
self.config["block_predictive_text"] = False
|
||||||
|
|
||||||
|
if not "config_template" in self.config:
|
||||||
|
self.config["config_template"] = None
|
||||||
if not "connect_transport" in self.config:
|
if not "connect_transport" in self.config:
|
||||||
self.config["connect_transport"] = False
|
self.config["connect_transport"] = False
|
||||||
if not "connect_rnode" in self.config:
|
if not "connect_rnode" in self.config:
|
||||||
|
@ -801,9 +826,8 @@ class SidebandCore():
|
||||||
time.sleep(0.15)
|
time.sleep(0.15)
|
||||||
try:
|
try:
|
||||||
self.saving_configuration = True
|
self.saving_configuration = True
|
||||||
config_file = open(self.config_path, "wb")
|
with open(self.config_path, "wb") as config_file:
|
||||||
config_file.write(msgpack.packb(self.config))
|
config_file.write(msgpack.packb(self.config))
|
||||||
config_file.close()
|
|
||||||
self.saving_configuration = False
|
self.saving_configuration = False
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.saving_configuration = False
|
self.saving_configuration = False
|
||||||
|
@ -3753,7 +3777,20 @@ class SidebandCore():
|
||||||
selected_level = 2
|
selected_level = 2
|
||||||
|
|
||||||
self.setstate("init.loadingstate", "Substantiating Reticulum")
|
self.setstate("init.loadingstate", "Substantiating Reticulum")
|
||||||
self.reticulum = RNS.Reticulum(configdir=self.rns_configdir, loglevel=selected_level, logdest=self._log_handler)
|
|
||||||
|
try:
|
||||||
|
self.reticulum = RNS.Reticulum(configdir=self.rns_configdir, loglevel=selected_level, logdest=self._log_handler)
|
||||||
|
if RNS.vendor.platformutils.is_android():
|
||||||
|
if self.is_service:
|
||||||
|
if os.path.isfile(self.rns_configdir+"/config_template_invalid"):
|
||||||
|
os.unlink(self.rns_configdir+"/config_template_invalid")
|
||||||
|
else:
|
||||||
|
pass
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
RNS.log(f"Error while instantiating Reticulum: {e}", RNS.LOG_ERROR)
|
||||||
|
RNS.log(f"Local configuration template changes will be ignored on next start", RNS.LOG_ERROR)
|
||||||
|
exit(255)
|
||||||
|
|
||||||
if self.is_service:
|
if self.is_service:
|
||||||
self.__start_rpc_listener()
|
self.__start_rpc_listener()
|
||||||
|
@ -4889,15 +4926,41 @@ class SidebandCore():
|
||||||
if not self.reticulum.is_connected_to_shared_instance:
|
if not self.reticulum.is_connected_to_shared_instance:
|
||||||
RNS.Transport.detach_interfaces()
|
RNS.Transport.detach_interfaces()
|
||||||
|
|
||||||
rns_config = """
|
rns_config = """# This template is used to generate a
|
||||||
|
# running configuration for Sideband's
|
||||||
|
# internal RNS instance. Incorrect changes
|
||||||
|
# or addition here may cause Sideband to
|
||||||
|
# fail starting up or working properly.
|
||||||
|
#
|
||||||
|
# If Sideband detects that Reticulum
|
||||||
|
# aborts at startup, due to an error in
|
||||||
|
# configuration, any template changes
|
||||||
|
# will be reset to this default.
|
||||||
|
|
||||||
[reticulum]
|
[reticulum]
|
||||||
enable_transport = TRANSPORT_IS_ENABLED
|
# Don't change this line, use the UI
|
||||||
share_instance = Yes
|
# setting for selecting whether RNS
|
||||||
shared_instance_port = 37428
|
# transport is enabled or disabled
|
||||||
instance_control_port = 37429
|
enable_transport = TRANSPORT_IS_ENABLED
|
||||||
panic_on_interface_error = No
|
|
||||||
|
|
||||||
|
# Changing this setting will cause
|
||||||
|
# Sideband to not work.
|
||||||
|
share_instance = Yes
|
||||||
|
|
||||||
|
# Changing these options should only
|
||||||
|
# be done if you know what you're doing.
|
||||||
|
shared_instance_port = 37428
|
||||||
|
instance_control_port = 37429
|
||||||
|
panic_on_interface_error = No
|
||||||
|
|
||||||
|
# Logging is controlled by settings
|
||||||
|
# in the UI, so this section is mostly
|
||||||
|
# not relevant in Sideband.
|
||||||
[logging]
|
[logging]
|
||||||
loglevel = 3
|
loglevel = 3
|
||||||
|
|
||||||
|
# No additional interfaces are currently
|
||||||
|
# defined, but you can use this section
|
||||||
|
# to do so.
|
||||||
|
[interfaces]
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -1583,7 +1583,7 @@ MDScreen:
|
||||||
height: dp(48)
|
height: dp(48)
|
||||||
|
|
||||||
MDLabel:
|
MDLabel:
|
||||||
text: "Announce Automatically"
|
text: "Announce automatically"
|
||||||
font_style: "H6"
|
font_style: "H6"
|
||||||
|
|
||||||
MDSwitch:
|
MDSwitch:
|
||||||
|
@ -1598,7 +1598,7 @@ MDScreen:
|
||||||
height: dp(48)
|
height: dp(48)
|
||||||
|
|
||||||
MDLabel:
|
MDLabel:
|
||||||
text: "Try propagation on direct delivery failure"
|
text: "Try propagation automatically"
|
||||||
font_style: "H6"
|
font_style: "H6"
|
||||||
|
|
||||||
MDSwitch:
|
MDSwitch:
|
||||||
|
|
|
@ -116,6 +116,35 @@ class Utilities():
|
||||||
if self.app.root.ids.screen_manager.current == "rnstatus_screen":
|
if self.app.root.ids.screen_manager.current == "rnstatus_screen":
|
||||||
Clock.schedule_once(self.update_rnstatus, 1)
|
Clock.schedule_once(self.update_rnstatus, 1)
|
||||||
|
|
||||||
|
### Advanced Configuration screen
|
||||||
|
######################################
|
||||||
|
|
||||||
|
def advanced_action(self, sender=None):
|
||||||
|
if not self.app.root.ids.screen_manager.has_screen("advanced_screen"):
|
||||||
|
self.advanced_screen = Builder.load_string(layout_advanced_screen)
|
||||||
|
self.advanced_screen.app = self.app
|
||||||
|
self.advanced_screen.delegate = self
|
||||||
|
self.app.root.ids.screen_manager.add_widget(self.advanced_screen)
|
||||||
|
|
||||||
|
self.app.root.ids.screen_manager.transition.direction = "left"
|
||||||
|
self.app.root.ids.screen_manager.current = "advanced_screen"
|
||||||
|
self.app.sideband.setstate("app.displaying", self.app.root.ids.screen_manager.current)
|
||||||
|
|
||||||
|
self.update_advanced()
|
||||||
|
|
||||||
|
def update_advanced(self, sender=None):
|
||||||
|
ct = self.app.sideband.config["config_template"]
|
||||||
|
self.advanced_screen.ids.config_template.text = f"[font=RobotoMono-Regular][size={int(dp(12))}]{ct}[/size][/font]"
|
||||||
|
|
||||||
|
def copy_config(self, sender=None):
|
||||||
|
Clipboard.copy(self.app.sideband.config_template)
|
||||||
|
|
||||||
|
def paste_config(self, sender=None):
|
||||||
|
self.app.sideband.config_template = Clipboard.paste()
|
||||||
|
self.app.sideband.config["config_template"] = self.app.sideband.config_template
|
||||||
|
self.app.sideband.save_configuration()
|
||||||
|
self.update_advanced()
|
||||||
|
|
||||||
### Log viewer screen
|
### Log viewer screen
|
||||||
######################################
|
######################################
|
||||||
|
|
||||||
|
@ -332,3 +361,76 @@ MDScreen:
|
||||||
text_size: self.width, None
|
text_size: self.width, None
|
||||||
height: self.texture_size[1]
|
height: self.texture_size[1]
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
layout_advanced_screen = """
|
||||||
|
MDScreen:
|
||||||
|
name: "advanced_screen"
|
||||||
|
|
||||||
|
BoxLayout:
|
||||||
|
orientation: "vertical"
|
||||||
|
|
||||||
|
MDTopAppBar:
|
||||||
|
id: top_bar
|
||||||
|
title: "RNS Configuration"
|
||||||
|
anchor_title: "left"
|
||||||
|
elevation: 0
|
||||||
|
left_action_items:
|
||||||
|
[['menu', lambda x: root.app.nav_drawer.set_state("open")]]
|
||||||
|
right_action_items:
|
||||||
|
[
|
||||||
|
# ['refresh', lambda x: root.delegate.update_rnstatus()],
|
||||||
|
['close', lambda x: root.app.close_sub_utilities_action(self)],
|
||||||
|
]
|
||||||
|
|
||||||
|
MDScrollView:
|
||||||
|
id: advanced_scrollview
|
||||||
|
size_hint_x: 1
|
||||||
|
size_hint_y: None
|
||||||
|
size: [root.width, root.height-root.ids.top_bar.height]
|
||||||
|
do_scroll_x: False
|
||||||
|
do_scroll_y: True
|
||||||
|
|
||||||
|
MDGridLayout:
|
||||||
|
cols: 1
|
||||||
|
padding: [dp(28), dp(14), dp(28), dp(28)]
|
||||||
|
size_hint_y: None
|
||||||
|
height: self.minimum_height
|
||||||
|
|
||||||
|
MDBoxLayout:
|
||||||
|
orientation: "horizontal"
|
||||||
|
spacing: dp(24)
|
||||||
|
size_hint_y: None
|
||||||
|
height: self.minimum_height
|
||||||
|
padding: [dp(0), dp(14), dp(0), dp(24)]
|
||||||
|
|
||||||
|
MDRectangleFlatIconButton:
|
||||||
|
id: telemetry_button
|
||||||
|
icon: "content-copy"
|
||||||
|
text: "Copy Configuration"
|
||||||
|
padding: [dp(0), dp(14), dp(0), dp(14)]
|
||||||
|
icon_size: dp(24)
|
||||||
|
font_size: dp(16)
|
||||||
|
size_hint: [1.0, None]
|
||||||
|
on_release: root.delegate.copy_config(self)
|
||||||
|
disabled: False
|
||||||
|
|
||||||
|
MDRectangleFlatIconButton:
|
||||||
|
id: coordinates_button
|
||||||
|
icon: "download"
|
||||||
|
text: "Paste Configuration"
|
||||||
|
padding: [dp(0), dp(14), dp(0), dp(14)]
|
||||||
|
icon_size: dp(24)
|
||||||
|
font_size: dp(16)
|
||||||
|
size_hint: [1.0, None]
|
||||||
|
on_release: root.delegate.paste_config(self)
|
||||||
|
disabled: False
|
||||||
|
|
||||||
|
|
||||||
|
MDLabel:
|
||||||
|
id: config_template
|
||||||
|
markup: True
|
||||||
|
text: ""
|
||||||
|
size_hint_y: None
|
||||||
|
text_size: self.width, None
|
||||||
|
height: self.texture_size[1]
|
||||||
|
"""
|
||||||
|
|
Loading…
Reference in New Issue