Initial handling for local shared instance

This commit is contained in:
Mark Qvist 2020-05-13 16:03:50 +02:00
parent 27f5b8fb3e
commit 6903c7a2f6

View File

@ -41,6 +41,13 @@ class Reticulum:
Reticulum.__transport_enabled = False
Reticulum.__use_implicit_proof = True
self.local_interface_port = 37428
self.share_instance = True
self.is_shared_instance = False
self.is_connected_to_shared_instance = False
self.is_standalone_instance = False
if not os.path.isdir(Reticulum.storagepath):
os.makedirs(Reticulum.storagepath)
@ -69,6 +76,41 @@ class Reticulum:
atexit.register(Reticulum.exit_handler)
def start_local_interface(self):
if self.share_instance:
try:
interface = LocalInterface.LocalServerInterface(
RNS.Transport,
self.local_interface_port
)
interface.OUT = True
RNS.Transport.interfaces.append(interface)
self.is_shared_instance = True
RNS.log("Started shared instance interface: "+str(interface), RNS.LOG_DEBUG)
except Exception as e:
try:
interface = LocalInterface.LocalClientInterface(
RNS.Transport,
"Local shared instance",
self.local_interface_port)
interface.target_port = self.local_interface_port
interface.OUT = True
RNS.Transport.interfaces.append(interface)
self.is_shared_instance = False
self.is_standalone_instance = False
self.is_connected_to_shared_instance = True
RNS.log("Connected to local shared instance via: "+str(interface), RNS.LOG_DEBUG)
except Exception as e:
RNS.log("Local shared instance appears to be running, but it could not be connected", RNS.LOG_ERROR)
RNS.log("The contained exception was: "+str(e), RNS.LOG_ERROR)
self.is_shared_instance = False
self.is_standalone_instance = True
self.is_connected_to_shared_instance = False
else:
self.is_shared_instance = False
self.is_standalone_instance = True
self.is_connected_to_shared_instance = False
def applyConfig(self):
if "logging" in self.config:
for option in self.config["logging"]:
@ -83,6 +125,12 @@ class Reticulum:
if "reticulum" in self.config:
for option in self.config["reticulum"]:
value = self.config["reticulum"][option]
if option == "share_instance":
value = self.config["reticulum"].as_bool(option)
self.share_instance = value
if option == "shared_instance_port":
value = int(self.config["reticulum"][option])
self.local_interface_port = value
if option == "enable_transport":
v = self.config["reticulum"].as_bool(option)
if v == True:
@ -108,6 +156,12 @@ class Reticulum:
RNS.log("", RNS.LOG_CRITICAL)
Reticulum.__allow_unencrypted = True
self.start_local_interface()
if self.is_shared_instance or self.is_standalone_instance:
# TODO: Remove
RNS.log("Starting local interfaces...")
interface_names = []
for name in self.config["interfaces"]:
if not name in interface_names:
@ -346,16 +400,41 @@ __default_rns_config__ = '''# This is the default Reticulum config file.
# Don't allow unencrypted links by default.
# If you REALLY need to allow unencrypted links, for example
# for debug or regulatory purposes, this can be set to true.
# This directive is optional and can be removed for brevity.
allow_unencrypted = False
# If you enable Transport, your system will route traffic
# for other peers, pass announces and serve path requests.
# Unless you really know what you're doing, this should be
# done only for systems that are suited to act as transport
# nodes, ie. if they are stationary and always-on.
# nodes, ie. if they are stationary and always-on. This
# directive is optional and can be removed for brevity.
enable_transport = False
# By default, the first program to launch the Reticulum
# Network Stack will create a shared instance, that other
# programs can communicate with. Only the shared instance
# opens all the configured interfaces directly, and other
# local programs communicate with the shared instance over
# a local socket. This is completely transparent to the
# user, and should generally be turned on. This directive
# is optional and can be removed for brevity.
share_instance = Yes
# If you want to run multiple *different* shared instances
# on the same system, you will need to specify a different
# shared instance port for each. The default is given below,
# and again, this option is optional and can be left out.
shared_instance_port = 37428
[logging]
# Valid log levels are 0 through 7:
# 0: Log only critical information