mirror of
https://github.com/markqvist/Reticulum.git
synced 2024-11-22 21:50:18 +00:00
Compare commits
15 Commits
5cf4869eda
...
33ea1eba8d
Author | SHA1 | Date | |
---|---|---|---|
|
33ea1eba8d | ||
|
221493d816 | ||
|
b17175dfef | ||
|
1103784997 | ||
|
e47dcae54e | ||
|
acd893a6e6 | ||
|
c032a2e438 | ||
|
1f6a494e14 | ||
|
059c2381b5 | ||
|
541d3cde48 | ||
|
87ff1808a2 | ||
|
8d1a000378 | ||
|
794a5f4401 | ||
|
7159e6a523 | ||
|
cf41187e2f |
22
Changelog.md
22
Changelog.md
@ -1,3 +1,25 @@
|
|||||||
|
### 2024-05-05: RNS β 0.7.4
|
||||||
|
|
||||||
|
This maintenance release fixes a number of bugs, improves path requests and responses, and adds several useful features and capabilities. Thanks to @cobraPA, @jsculthess, @thiaguetz and @nothingbutlucas who contributed to this release!
|
||||||
|
|
||||||
|
**Changes**
|
||||||
|
- Added support for flashing and autoinstalling Heltec V3 boards to `rnodeconf`
|
||||||
|
- Added custom EEPROM bootstrapping capabilities to `rnodeconf`
|
||||||
|
- Added ability to load identities from file to Echo and Link examples
|
||||||
|
- Added ability to specify multicast address type in AutoInterface configuration
|
||||||
|
- Added link getter to resource advertisement class
|
||||||
|
- Improved path response logic and timing
|
||||||
|
- Improved path request timing
|
||||||
|
- Fixed a bug in Link Request proof delivery on unknown hop count paths
|
||||||
|
- Fixed broken link packet routing in topologies where transport packets leak to non-intended instances in the link chain
|
||||||
|
- Fixed typos in documentation
|
||||||
|
|
||||||
|
**Release Hashes**
|
||||||
|
```
|
||||||
|
f5c35f1b8720778eb508b687d66334d01b4ab266b2d8c2bc186702220dcaae29 rns-0.7.4-py3-none-any.whl
|
||||||
|
9eaa7170f97dad49551136965d3fcc971b56b1c2eda48c24b9ffd58d71daa016 rnspure-0.7.4-py3-none-any.whl
|
||||||
|
```
|
||||||
|
|
||||||
### 2024-03-09: RNS β 0.7.3
|
### 2024-03-09: RNS β 0.7.3
|
||||||
|
|
||||||
This release adds the ability to specify custom firmware URLs for flashing boards with `rnodeconf`. Thanks to @attermann who contributed to this release!
|
This release adds the ability to specify custom firmware URLs for flashing boards with `rnodeconf`. Thanks to @attermann who contributed to this release!
|
||||||
|
@ -37,26 +37,48 @@ SIG_EXT = "rsg"
|
|||||||
ENCRYPT_EXT = "rfe"
|
ENCRYPT_EXT = "rfe"
|
||||||
CHUNK_SIZE = 16*1024*1024
|
CHUNK_SIZE = 16*1024*1024
|
||||||
|
|
||||||
def spin(until=None, msg=None, timeout=None):
|
|
||||||
|
def spin(until=None, msg="", timeout=None):
|
||||||
i = 0
|
i = 0
|
||||||
syms = "⢄⢂⢁⡁⡈⡐⡠"
|
syms = "⢄⢂⢁⡁⡈⡐⡠"
|
||||||
if timeout != None:
|
if timeout is not None:
|
||||||
timeout = time.time()+timeout
|
timeout = time.time()+timeout
|
||||||
|
|
||||||
print(msg+" ", end=" ")
|
print(msg, end=" ")
|
||||||
while (timeout == None or time.time()<timeout) and not until():
|
while (timeout is None or time.time()<timeout) and not until():
|
||||||
time.sleep(0.1)
|
time.sleep(0.1)
|
||||||
print(("\b\b"+syms[i]+" "), end="")
|
print(("\b\b", syms[i]), end=" ", sep="")
|
||||||
sys.stdout.flush()
|
sys.stdout.flush()
|
||||||
i = (i+1)%len(syms)
|
i = (i+1)%len(syms)
|
||||||
|
|
||||||
print("\r"+" "*len(msg)+" \r", end="")
|
print("\r", *len(msg), "\r", end="", sep="")
|
||||||
|
|
||||||
if timeout != None and time.time() > timeout:
|
if timeout is not None and time.time() > timeout:
|
||||||
return False
|
return False
|
||||||
else:
|
else:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def get_keys(args: argparse.Namespace, identity) -> None:
|
||||||
|
"""Get public or/and private keys"""
|
||||||
|
|
||||||
|
if args.base64:
|
||||||
|
RNS.log("Public Key : " + base64.urlsafe_b64encode(identity.get_public_key()).decode("utf-8"))
|
||||||
|
elif args.base32:
|
||||||
|
RNS.log("Public Key : " + base64.b32encode(identity.get_public_key()).decode("utf-8"))
|
||||||
|
else:
|
||||||
|
RNS.log("Public Key : " + RNS.hexrep(identity.get_public_key(), delimit=False))
|
||||||
|
if identity.prv:
|
||||||
|
if args.print_private:
|
||||||
|
if args.base64:
|
||||||
|
RNS.log("Private Key : " + base64.urlsafe_b64encode(identity.get_private_key()).decode("utf-8"))
|
||||||
|
elif args.base32:
|
||||||
|
RNS.log("Private Key : " + base64.b32encode(identity.get_private_key()).decode("utf-8"))
|
||||||
|
else:
|
||||||
|
RNS.log("Private Key : " + RNS.hexrep(identity.get_private_key(), delimit=False))
|
||||||
|
else:
|
||||||
|
RNS.log("Private Key : Hidden")
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
try:
|
try:
|
||||||
parser = argparse.ArgumentParser(description="Reticulum Identity & Encryption Utility")
|
parser = argparse.ArgumentParser(description="Reticulum Identity & Encryption Utility")
|
||||||
@ -82,7 +104,7 @@ def main():
|
|||||||
parser.add_argument("-w", "--write", metavar="file", action="store", default=None, help="output file path", type=str)
|
parser.add_argument("-w", "--write", metavar="file", action="store", default=None, help="output file path", type=str)
|
||||||
parser.add_argument("-f", "--force", action="store_true", default=None, help="write output even if it overwrites existing files")
|
parser.add_argument("-f", "--force", action="store_true", default=None, help="write output even if it overwrites existing files")
|
||||||
parser.add_argument("-I", "--stdin", action="store_true", default=False, help=argparse.SUPPRESS) # "read input from STDIN instead of file"
|
parser.add_argument("-I", "--stdin", action="store_true", default=False, help=argparse.SUPPRESS) # "read input from STDIN instead of file"
|
||||||
parser.add_argument("-O", "--stdout", action="store_true", default=False, help=argparse.SUPPRESS) # help="write output to STDOUT instead of file",
|
parser.add_argument("-O", "--stdout", action="store_true", default=False, help=argparse.SUPPRESS) # help="write output to STDOUT instead of file",
|
||||||
|
|
||||||
parser.add_argument("-R", "--request", action="store_true", default=False, help="request unknown Identities from the network")
|
parser.add_argument("-R", "--request", action="store_true", default=False, help="request unknown Identities from the network")
|
||||||
parser.add_argument("-t", action="store", metavar="seconds", type=float, help="identity request timeout before giving up", default=RNS.Transport.PATH_REQUEST_TIMEOUT)
|
parser.add_argument("-t", action="store", metavar="seconds", type=float, help="identity request timeout before giving up", default=RNS.Transport.PATH_REQUEST_TIMEOUT)
|
||||||
@ -93,14 +115,10 @@ def main():
|
|||||||
parser.add_argument("-B", "--base32", action="store_true", default=False, help="Use base32-encoded input and output")
|
parser.add_argument("-B", "--base32", action="store_true", default=False, help="Use base32-encoded input and output")
|
||||||
|
|
||||||
parser.add_argument("--version", action="version", version="rnid {version}".format(version=__version__))
|
parser.add_argument("--version", action="version", version="rnid {version}".format(version=__version__))
|
||||||
|
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
ops = 0;
|
ops = sum(1 for t in [args.encrypt, args.decrypt, args.validate, args.sign] if t)
|
||||||
for t in [args.encrypt, args.decrypt, args.validate, args.sign]:
|
|
||||||
if t:
|
|
||||||
ops += 1
|
|
||||||
|
|
||||||
if ops > 1:
|
if ops > 1:
|
||||||
RNS.log("This utility currently only supports one of the encrypt, decrypt, sign or verify operations per invocation", RNS.LOG_ERROR)
|
RNS.log("This utility currently only supports one of the encrypt, decrypt, sign or verify operations per invocation", RNS.LOG_ERROR)
|
||||||
exit(1)
|
exit(1)
|
||||||
@ -134,22 +152,8 @@ def main():
|
|||||||
exit(42)
|
exit(42)
|
||||||
|
|
||||||
RNS.log("Identity imported")
|
RNS.log("Identity imported")
|
||||||
if args.base64:
|
|
||||||
RNS.log("Public Key : "+base64.urlsafe_b64encode(identity.get_public_key()).decode("utf-8"))
|
get_keys(args, identity)
|
||||||
elif args.base32:
|
|
||||||
RNS.log("Public Key : "+base64.b32encode(identity.get_public_key()).decode("utf-8"))
|
|
||||||
else:
|
|
||||||
RNS.log("Public Key : "+RNS.hexrep(identity.get_public_key(), delimit=False))
|
|
||||||
if identity.prv:
|
|
||||||
if args.print_private:
|
|
||||||
if args.base64:
|
|
||||||
RNS.log("Private Key : "+base64.urlsafe_b64encode(identity.get_private_key()).decode("utf-8"))
|
|
||||||
elif args.base32:
|
|
||||||
RNS.log("Private Key : "+base64.b32encode(identity.get_private_key()).decode("utf-8"))
|
|
||||||
else:
|
|
||||||
RNS.log("Private Key : "+RNS.hexrep(identity.get_private_key(), delimit=False))
|
|
||||||
else:
|
|
||||||
RNS.log("Private Key : Hidden")
|
|
||||||
|
|
||||||
if args.write:
|
if args.write:
|
||||||
try:
|
try:
|
||||||
@ -179,7 +183,7 @@ def main():
|
|||||||
quietness = args.quiet
|
quietness = args.quiet
|
||||||
if verbosity != 0 or quietness != 0:
|
if verbosity != 0 or quietness != 0:
|
||||||
targetloglevel = targetloglevel+verbosity-quietness
|
targetloglevel = targetloglevel+verbosity-quietness
|
||||||
|
|
||||||
# Start Reticulum
|
# Start Reticulum
|
||||||
reticulum = RNS.Reticulum(configdir=args.config, loglevel=targetloglevel)
|
reticulum = RNS.Reticulum(configdir=args.config, loglevel=targetloglevel)
|
||||||
RNS.compact_log_fmt = True
|
RNS.compact_log_fmt = True
|
||||||
@ -208,7 +212,7 @@ def main():
|
|||||||
destination_hash = bytes.fromhex(identity_str)
|
destination_hash = bytes.fromhex(identity_str)
|
||||||
identity = RNS.Identity.recall(destination_hash)
|
identity = RNS.Identity.recall(destination_hash)
|
||||||
|
|
||||||
if identity == None:
|
if identity is None:
|
||||||
if not args.request:
|
if not args.request:
|
||||||
RNS.log("Could not recall Identity for "+RNS.prettyhexrep(destination_hash)+".", RNS.LOG_ERROR)
|
RNS.log("Could not recall Identity for "+RNS.prettyhexrep(destination_hash)+".", RNS.LOG_ERROR)
|
||||||
RNS.log("You can query the network for unknown Identities with the -R option.", RNS.LOG_ERROR)
|
RNS.log("You can query the network for unknown Identities with the -R option.", RNS.LOG_ERROR)
|
||||||
@ -216,7 +220,7 @@ def main():
|
|||||||
else:
|
else:
|
||||||
RNS.Transport.request_path(destination_hash)
|
RNS.Transport.request_path(destination_hash)
|
||||||
def spincheck():
|
def spincheck():
|
||||||
return RNS.Identity.recall(destination_hash) != None
|
return RNS.Identity.recall(destination_hash) is not None
|
||||||
spin(spincheck, "Requesting unknown Identity for "+RNS.prettyhexrep(destination_hash), args.t)
|
spin(spincheck, "Requesting unknown Identity for "+RNS.prettyhexrep(destination_hash), args.t)
|
||||||
|
|
||||||
if not spincheck():
|
if not spincheck():
|
||||||
@ -224,17 +228,15 @@ def main():
|
|||||||
exit(6)
|
exit(6)
|
||||||
else:
|
else:
|
||||||
identity = RNS.Identity.recall(destination_hash)
|
identity = RNS.Identity.recall(destination_hash)
|
||||||
RNS.log("Received Identity "+str(identity)+" for destination "+RNS.prettyhexrep(destination_hash)+" from the network")
|
RNS.log(" ".join(["Received Identity", str(identity), "for destination", RNS.prettyhexrep(destination_hash), "from the network"]))
|
||||||
|
|
||||||
else:
|
else:
|
||||||
RNS.log("Recalled Identity "+str(identity)+" for destination "+RNS.prettyhexrep(destination_hash))
|
RNS.log(" ".join(["Recalled Identity", str(identity), "for destination", RNS.prettyhexrep(destination_hash)]))
|
||||||
|
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
RNS.log("Invalid hexadecimal hash provided", RNS.LOG_ERROR)
|
RNS.log("Invalid hexadecimal hash provided", RNS.LOG_ERROR)
|
||||||
exit(7)
|
exit(7)
|
||||||
|
|
||||||
|
|
||||||
else:
|
else:
|
||||||
# Try loading Identity from file
|
# Try loading Identity from file
|
||||||
if not os.path.isfile(identity_str):
|
if not os.path.isfile(identity_str):
|
||||||
@ -243,13 +245,13 @@ def main():
|
|||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
identity = RNS.Identity.from_file(identity_str)
|
identity = RNS.Identity.from_file(identity_str)
|
||||||
RNS.log("Loaded Identity "+str(identity)+" from "+str(identity_str))
|
RNS.log(" ".join(["Loaded Identity", str(identity), "from", str(identity_str)]))
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
RNS.log("Could not decode Identity from specified file")
|
RNS.log("Could not decode Identity from specified file")
|
||||||
exit(9)
|
exit(9)
|
||||||
|
|
||||||
if identity != None:
|
if identity is not None:
|
||||||
if args.hash:
|
if args.hash:
|
||||||
try:
|
try:
|
||||||
aspects = args.hash.split(".")
|
aspects = args.hash.split(".")
|
||||||
@ -259,9 +261,9 @@ def main():
|
|||||||
else:
|
else:
|
||||||
app_name = aspects[0]
|
app_name = aspects[0]
|
||||||
aspects = aspects[1:]
|
aspects = aspects[1:]
|
||||||
if identity.pub != None:
|
if identity.pub is not None:
|
||||||
destination = RNS.Destination(identity, RNS.Destination.OUT, RNS.Destination.SINGLE, app_name, *aspects)
|
destination = RNS.Destination(identity, RNS.Destination.OUT, RNS.Destination.SINGLE, app_name, *aspects)
|
||||||
RNS.log("The "+str(args.hash)+" destination for this Identity is "+RNS.prettyhexrep(destination.hash))
|
RNS.log(" ".join(["The", str(args.hash), "destination for this Identity is", RNS.prettyhexrep(destination.hash)]))
|
||||||
RNS.log("The full destination specifier is "+str(destination))
|
RNS.log("The full destination specifier is "+str(destination))
|
||||||
time.sleep(0.25)
|
time.sleep(0.25)
|
||||||
exit(0)
|
exit(0)
|
||||||
@ -282,7 +284,7 @@ def main():
|
|||||||
else:
|
else:
|
||||||
app_name = aspects[0]
|
app_name = aspects[0]
|
||||||
aspects = aspects[1:]
|
aspects = aspects[1:]
|
||||||
if identity.prv != None:
|
if identity.prv is not None:
|
||||||
destination = RNS.Destination(identity, RNS.Destination.IN, RNS.Destination.SINGLE, app_name, *aspects)
|
destination = RNS.Destination(identity, RNS.Destination.IN, RNS.Destination.SINGLE, app_name, *aspects)
|
||||||
RNS.log("Created destination "+str(destination))
|
RNS.log("Created destination "+str(destination))
|
||||||
RNS.log("Announcing destination "+RNS.prettyhexrep(destination.hash))
|
RNS.log("Announcing destination "+RNS.prettyhexrep(destination.hash))
|
||||||
@ -291,7 +293,7 @@ def main():
|
|||||||
exit(0)
|
exit(0)
|
||||||
else:
|
else:
|
||||||
destination = RNS.Destination(identity, RNS.Destination.OUT, RNS.Destination.SINGLE, app_name, *aspects)
|
destination = RNS.Destination(identity, RNS.Destination.OUT, RNS.Destination.SINGLE, app_name, *aspects)
|
||||||
RNS.log("The "+str(args.announce)+" destination for this Identity is "+RNS.prettyhexrep(destination.hash))
|
RNS.log(" ".join(["The", str(args.announce), "destination for this Identity is", RNS.prettyhexrep(destination.hash)]))
|
||||||
RNS.log("The full destination specifier is "+str(destination))
|
RNS.log("The full destination specifier is "+str(destination))
|
||||||
RNS.log("Cannot announce this destination, since the private key is not held")
|
RNS.log("Cannot announce this destination, since the private key is not held")
|
||||||
time.sleep(0.25)
|
time.sleep(0.25)
|
||||||
@ -303,22 +305,7 @@ def main():
|
|||||||
exit(0)
|
exit(0)
|
||||||
|
|
||||||
if args.print_identity:
|
if args.print_identity:
|
||||||
if args.base64:
|
get_keys(args, identity)
|
||||||
RNS.log("Public Key : "+base64.urlsafe_b64encode(identity.get_public_key()).decode("utf-8"))
|
|
||||||
elif args.base32:
|
|
||||||
RNS.log("Public Key : "+base64.b32encode(identity.get_public_key()).decode("utf-8"))
|
|
||||||
else:
|
|
||||||
RNS.log("Public Key : "+RNS.hexrep(identity.get_public_key(), delimit=False))
|
|
||||||
if identity.prv:
|
|
||||||
if args.print_private:
|
|
||||||
if args.base64:
|
|
||||||
RNS.log("Private Key : "+base64.urlsafe_b64encode(identity.get_private_key()).decode("utf-8"))
|
|
||||||
elif args.base32:
|
|
||||||
RNS.log("Private Key : "+base64.b32encode(identity.get_private_key()).decode("utf-8"))
|
|
||||||
else:
|
|
||||||
RNS.log("Private Key : "+RNS.hexrep(identity.get_private_key(), delimit=False))
|
|
||||||
else:
|
|
||||||
RNS.log("Private Key : Hidden")
|
|
||||||
exit(0)
|
exit(0)
|
||||||
|
|
||||||
if args.export:
|
if args.export:
|
||||||
@ -373,7 +360,7 @@ def main():
|
|||||||
if args.decrypt and not args.write and not args.stdout and args.read and args.read.lower().endswith("."+ENCRYPT_EXT):
|
if args.decrypt and not args.write and not args.stdout and args.read and args.read.lower().endswith("."+ENCRYPT_EXT):
|
||||||
args.write = str(args.read).replace("."+ENCRYPT_EXT, "")
|
args.write = str(args.read).replace("."+ENCRYPT_EXT, "")
|
||||||
|
|
||||||
if args.sign and identity.prv == None:
|
if args.sign and identity.prv is None:
|
||||||
RNS.log("Specified Identity does not hold a private key. Cannot sign.", RNS.LOG_ERROR)
|
RNS.log("Specified Identity does not hold a private key. Cannot sign.", RNS.LOG_ERROR)
|
||||||
exit(14)
|
exit(14)
|
||||||
|
|
||||||
@ -391,7 +378,7 @@ def main():
|
|||||||
RNS.log("Could not open output file for writing", RNS.LOG_ERROR)
|
RNS.log("Could not open output file for writing", RNS.LOG_ERROR)
|
||||||
RNS.log("The contained exception was: "+str(e), RNS.LOG_ERROR)
|
RNS.log("The contained exception was: "+str(e), RNS.LOG_ERROR)
|
||||||
exit(15)
|
exit(15)
|
||||||
|
|
||||||
# TODO: Actually expand this to a good solution
|
# TODO: Actually expand this to a good solution
|
||||||
# probably need to create a wrapper that takes
|
# probably need to create a wrapper that takes
|
||||||
# into account not closing stdout when done
|
# into account not closing stdout when done
|
||||||
@ -399,7 +386,7 @@ def main():
|
|||||||
# data_output = sys.stdout
|
# data_output = sys.stdout
|
||||||
|
|
||||||
if args.sign:
|
if args.sign:
|
||||||
if identity.prv == None:
|
if identity.prv is None:
|
||||||
RNS.log("Specified Identity does not hold a private key. Cannot sign.", RNS.LOG_ERROR)
|
RNS.log("Specified Identity does not hold a private key. Cannot sign.", RNS.LOG_ERROR)
|
||||||
exit(16)
|
exit(16)
|
||||||
|
|
||||||
@ -415,15 +402,15 @@ def main():
|
|||||||
|
|
||||||
if not args.stdout:
|
if not args.stdout:
|
||||||
RNS.log("Signing "+str(args.read))
|
RNS.log("Signing "+str(args.read))
|
||||||
|
|
||||||
try:
|
try:
|
||||||
data_output.write(identity.sign(data_input.read()))
|
data_output.write(identity.sign(data_input.read()))
|
||||||
data_output.close()
|
data_output.close()
|
||||||
data_input.close()
|
data_input.close()
|
||||||
|
|
||||||
if not args.stdout:
|
if not args.stdout:
|
||||||
if args.read:
|
if args.read:
|
||||||
RNS.log("File "+str(args.read)+" signed with "+str(identity)+" to "+str(args.write))
|
RNS.log(" ".join([ "File", str(args.read), "signed with", str(identity), "to", str(args.write) ]))
|
||||||
exit(0)
|
exit(0)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@ -448,7 +435,7 @@ def main():
|
|||||||
else:
|
else:
|
||||||
# if not args.stdout:
|
# if not args.stdout:
|
||||||
# RNS.log("Verifying "+str(args.validate)+" for "+str(args.read))
|
# RNS.log("Verifying "+str(args.validate)+" for "+str(args.read))
|
||||||
|
|
||||||
try:
|
try:
|
||||||
try:
|
try:
|
||||||
sig_input = open(args.validate, "rb")
|
sig_input = open(args.validate, "rb")
|
||||||
@ -457,18 +444,17 @@ def main():
|
|||||||
RNS.log("The contained exception was: "+str(e), RNS.LOG_ERROR)
|
RNS.log("The contained exception was: "+str(e), RNS.LOG_ERROR)
|
||||||
exit(21)
|
exit(21)
|
||||||
|
|
||||||
|
|
||||||
validated = identity.validate(sig_input.read(), data_input.read())
|
validated = identity.validate(sig_input.read(), data_input.read())
|
||||||
sig_input.close()
|
sig_input.close()
|
||||||
data_input.close()
|
data_input.close()
|
||||||
|
|
||||||
if not validated:
|
if not validated:
|
||||||
if not args.stdout:
|
if not args.stdout:
|
||||||
RNS.log("Signature "+str(args.validate)+" for file "+str(args.read)+" is invalid", RNS.LOG_ERROR)
|
RNS.log(" ".join(["Signature", str(args.validate), "for file", str(args.read), "is invalid"]), RNS.LOG_ERROR)
|
||||||
exit(22)
|
exit(22)
|
||||||
else:
|
else:
|
||||||
if not args.stdout:
|
if not args.stdout:
|
||||||
RNS.log("Signature "+str(args.validate)+" for file "+str(args.read)+" made by Identity "+str(identity)+" is valid")
|
RNS.log(" ".join(["Signature", str(args.validate), "for file", str(args.read), "made by Identity", str(identity), "is valid"]))
|
||||||
exit(0)
|
exit(0)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@ -498,7 +484,7 @@ def main():
|
|||||||
|
|
||||||
if not args.stdout:
|
if not args.stdout:
|
||||||
RNS.log("Encrypting "+str(args.read))
|
RNS.log("Encrypting "+str(args.read))
|
||||||
|
|
||||||
try:
|
try:
|
||||||
more_data = True
|
more_data = True
|
||||||
while more_data:
|
while more_data:
|
||||||
@ -511,7 +497,7 @@ def main():
|
|||||||
data_input.close()
|
data_input.close()
|
||||||
if not args.stdout:
|
if not args.stdout:
|
||||||
if args.read:
|
if args.read:
|
||||||
RNS.log("File "+str(args.read)+" encrypted for "+str(identity)+" to "+str(args.write))
|
RNS.log(" ".join(["File", str(args.read), "encrypted for", str(identity), "to", str(args.write)]))
|
||||||
exit(0)
|
exit(0)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@ -529,7 +515,7 @@ def main():
|
|||||||
exit(26)
|
exit(26)
|
||||||
|
|
||||||
if args.decrypt:
|
if args.decrypt:
|
||||||
if identity.prv == None:
|
if identity.prv is None:
|
||||||
RNS.log("Specified Identity does not hold a private key. Cannot decrypt.", RNS.LOG_ERROR)
|
RNS.log("Specified Identity does not hold a private key. Cannot decrypt.", RNS.LOG_ERROR)
|
||||||
exit(27)
|
exit(27)
|
||||||
|
|
||||||
@ -544,15 +530,15 @@ def main():
|
|||||||
exit(29)
|
exit(29)
|
||||||
|
|
||||||
if not args.stdout:
|
if not args.stdout:
|
||||||
RNS.log("Decrypting "+str(args.read)+"...")
|
RNS.log("".join(["Decrypting ", str(args.read), "..."]))
|
||||||
|
|
||||||
try:
|
try:
|
||||||
more_data = True
|
more_data = True
|
||||||
while more_data:
|
while more_data:
|
||||||
chunk = data_input.read(CHUNK_SIZE)
|
chunk = data_input.read(CHUNK_SIZE)
|
||||||
if chunk:
|
if chunk:
|
||||||
plaintext = identity.decrypt(chunk)
|
plaintext = identity.decrypt(chunk)
|
||||||
if plaintext == None:
|
if plaintext is None:
|
||||||
if not args.stdout:
|
if not args.stdout:
|
||||||
RNS.log("Data could not be decrypted with the specified Identity")
|
RNS.log("Data could not be decrypted with the specified Identity")
|
||||||
exit(30)
|
exit(30)
|
||||||
@ -564,7 +550,7 @@ def main():
|
|||||||
data_input.close()
|
data_input.close()
|
||||||
if not args.stdout:
|
if not args.stdout:
|
||||||
if args.read:
|
if args.read:
|
||||||
RNS.log("File "+str(args.read)+" decrypted with "+str(identity)+" to "+str(args.write))
|
RNS.log(" ".join(["File", str(args.read), "decrypted with", str(identity), "to", str(args.write)]))
|
||||||
exit(0)
|
exit(0)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@ -581,20 +567,10 @@ def main():
|
|||||||
pass
|
pass
|
||||||
exit(31)
|
exit(31)
|
||||||
|
|
||||||
if True:
|
|
||||||
pass
|
|
||||||
|
|
||||||
elif False:
|
|
||||||
pass
|
|
||||||
|
|
||||||
else:
|
|
||||||
print("")
|
|
||||||
parser.print_help()
|
|
||||||
print("")
|
|
||||||
|
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
print("")
|
print("")
|
||||||
exit(255)
|
exit(255)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
|
@ -24,23 +24,23 @@
|
|||||||
|
|
||||||
import RNS
|
import RNS
|
||||||
import argparse
|
import argparse
|
||||||
import time
|
|
||||||
|
|
||||||
from RNS._version import __version__
|
from RNS._version import __version__
|
||||||
|
|
||||||
|
|
||||||
def program_setup(configdir, verbosity = 0, quietness = 0, service = False):
|
def program_setup(configdir, verbosity=0, quietness=0, service=False):
|
||||||
targetverbosity = verbosity-quietness
|
targetverbosity = verbosity - quietness
|
||||||
|
|
||||||
if service:
|
if service:
|
||||||
targetlogdest = RNS.LOG_FILE
|
targetlogdest = RNS.LOG_FILE
|
||||||
targetverbosity = None
|
targetverbosity = None
|
||||||
else:
|
else:
|
||||||
targetlogdest = RNS.LOG_STDOUT
|
targetlogdest = RNS.LOG_STDOUT
|
||||||
|
|
||||||
reticulum = RNS.Reticulum(configdir=configdir, verbosity=targetverbosity, logdest=targetlogdest)
|
RNS.Reticulum(configdir=configdir, verbosity=targetverbosity, logdest=targetlogdest)
|
||||||
exit(0)
|
exit(0)
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
try:
|
try:
|
||||||
parser = argparse.ArgumentParser(description="Reticulum Distributed Identity Resolver")
|
parser = argparse.ArgumentParser(description="Reticulum Distributed Identity Resolver")
|
||||||
@ -49,24 +49,23 @@ def main():
|
|||||||
parser.add_argument('-q', '--quiet', action='count', default=0)
|
parser.add_argument('-q', '--quiet', action='count', default=0)
|
||||||
parser.add_argument("--exampleconfig", action='store_true', default=False, help="print verbose configuration example to stdout and exit")
|
parser.add_argument("--exampleconfig", action='store_true', default=False, help="print verbose configuration example to stdout and exit")
|
||||||
parser.add_argument("--version", action="version", version="ir {version}".format(version=__version__))
|
parser.add_argument("--version", action="version", version="ir {version}".format(version=__version__))
|
||||||
|
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
if args.exampleconfig:
|
if args.exampleconfig:
|
||||||
print(__example_rns_config__)
|
print(__example_rns_config__)
|
||||||
exit()
|
exit()
|
||||||
|
|
||||||
|
configarg = None
|
||||||
if args.config:
|
if args.config:
|
||||||
configarg = args.config
|
configarg = args.config
|
||||||
else:
|
|
||||||
configarg = None
|
|
||||||
|
|
||||||
program_setup(configdir = configarg, verbosity=args.verbose, quietness=args.quiet)
|
program_setup(configdir=configarg, verbosity=args.verbose, quietness=args.quiet)
|
||||||
|
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
print("")
|
print("")
|
||||||
exit()
|
exit()
|
||||||
|
|
||||||
|
|
||||||
__example_rns_config__ = '''# This is an example Identity Resolver file.
|
__example_rns_config__ = '''# This is an example Identity Resolver file.
|
||||||
'''
|
'''
|
||||||
|
|
||||||
|
@ -27,13 +27,14 @@ import argparse
|
|||||||
|
|
||||||
from RNS._version import __version__
|
from RNS._version import __version__
|
||||||
|
|
||||||
|
|
||||||
def size_str(num, suffix='B'):
|
def size_str(num, suffix='B'):
|
||||||
units = ['','K','M','G','T','P','E','Z']
|
units = ['', 'K', 'M', 'G', 'T', 'P', 'E', 'Z']
|
||||||
last_unit = 'Y'
|
last_unit = 'Y'
|
||||||
|
|
||||||
if suffix == 'b':
|
if suffix == 'b':
|
||||||
num *= 8
|
num *= 8
|
||||||
units = ['','K','M','G','T','P','E','Z']
|
units = ['', 'K', 'M', 'G', 'T', 'P', 'E', 'Z']
|
||||||
last_unit = 'Y'
|
last_unit = 'Y'
|
||||||
|
|
||||||
for unit in units:
|
for unit in units:
|
||||||
@ -46,6 +47,14 @@ def size_str(num, suffix='B'):
|
|||||||
|
|
||||||
return "%.2f%s%s" % (num, last_unit, suffix)
|
return "%.2f%s%s" % (num, last_unit, suffix)
|
||||||
|
|
||||||
|
|
||||||
|
def convert_bytes_to_hex(value_obj):
|
||||||
|
if isinstance(value_obj, bytes):
|
||||||
|
return RNS.hexrep(value_obj, delimit=False)
|
||||||
|
elif isinstance(value_obj, dict):
|
||||||
|
return {key: convert_bytes_to_hex(value) for key, value in value_obj.items()}
|
||||||
|
return value_obj
|
||||||
|
|
||||||
def program_setup(configdir, dispall=False, verbosity=0, name_filter=None, json=False, astats=False, sorting=None, sort_reverse=False):
|
def program_setup(configdir, dispall=False, verbosity=0, name_filter=None, json=False, astats=False, sorting=None, sort_reverse=False):
|
||||||
reticulum = RNS.Reticulum(configdir = configdir, loglevel = 3+verbosity)
|
reticulum = RNS.Reticulum(configdir = configdir, loglevel = 3+verbosity)
|
||||||
|
|
||||||
@ -55,169 +64,159 @@ def program_setup(configdir, dispall=False, verbosity=0, name_filter=None, json=
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
if stats != None:
|
if stats is None:
|
||||||
if json:
|
|
||||||
import json
|
|
||||||
for s in stats:
|
|
||||||
if isinstance(stats[s], bytes):
|
|
||||||
stats[s] = RNS.hexrep(stats[s], delimit=False)
|
|
||||||
|
|
||||||
if isinstance(stats[s], dict):
|
|
||||||
for i in stats[s]:
|
|
||||||
if isinstance(i, dict):
|
|
||||||
for k in i:
|
|
||||||
if isinstance(i[k], bytes):
|
|
||||||
i[k] = RNS.hexrep(i[k], delimit=False)
|
|
||||||
|
|
||||||
print(json.dumps(stats))
|
|
||||||
exit()
|
|
||||||
|
|
||||||
interfaces = stats["interfaces"]
|
|
||||||
if sorting != None and isinstance(sorting, str):
|
|
||||||
sorting = sorting.lower()
|
|
||||||
if sorting == "rate" or sorting == "bitrate":
|
|
||||||
interfaces.sort(key=lambda i: i["bitrate"], reverse=not sort_reverse)
|
|
||||||
if sorting == "rx":
|
|
||||||
interfaces.sort(key=lambda i: i["rxb"], reverse=not sort_reverse)
|
|
||||||
if sorting == "tx":
|
|
||||||
interfaces.sort(key=lambda i: i["txb"], reverse=not sort_reverse)
|
|
||||||
if sorting == "traffic":
|
|
||||||
interfaces.sort(key=lambda i: i["rxb"]+i["txb"], reverse=not sort_reverse)
|
|
||||||
if sorting == "announces" or sorting == "announce":
|
|
||||||
interfaces.sort(key=lambda i: i["incoming_announce_frequency"]+i["outgoing_announce_frequency"], reverse=not sort_reverse)
|
|
||||||
if sorting == "arx":
|
|
||||||
interfaces.sort(key=lambda i: i["incoming_announce_frequency"], reverse=not sort_reverse)
|
|
||||||
if sorting == "atx":
|
|
||||||
interfaces.sort(key=lambda i: i["outgoing_announce_frequency"], reverse=not sort_reverse)
|
|
||||||
if sorting == "held":
|
|
||||||
interfaces.sort(key=lambda i: i["held_announces"], reverse=not sort_reverse)
|
|
||||||
|
|
||||||
|
|
||||||
for ifstat in interfaces:
|
|
||||||
name = ifstat["name"]
|
|
||||||
|
|
||||||
if dispall or not (
|
|
||||||
name.startswith("LocalInterface[") or
|
|
||||||
name.startswith("TCPInterface[Client") or
|
|
||||||
name.startswith("I2PInterfacePeer[Connected peer") or
|
|
||||||
(name.startswith("I2PInterface[") and ("i2p_connectable" in ifstat and ifstat["i2p_connectable"] == False))
|
|
||||||
):
|
|
||||||
|
|
||||||
if not (name.startswith("I2PInterface[") and ("i2p_connectable" in ifstat and ifstat["i2p_connectable"] == False)):
|
|
||||||
if name_filter == None or name_filter.lower() in name.lower():
|
|
||||||
print("")
|
|
||||||
|
|
||||||
if ifstat["status"]:
|
|
||||||
ss = "Up"
|
|
||||||
else:
|
|
||||||
ss = "Down"
|
|
||||||
|
|
||||||
if ifstat["mode"] == RNS.Interfaces.Interface.Interface.MODE_ACCESS_POINT:
|
|
||||||
modestr = "Access Point"
|
|
||||||
elif ifstat["mode"] == RNS.Interfaces.Interface.Interface.MODE_POINT_TO_POINT:
|
|
||||||
modestr = "Point-to-Point"
|
|
||||||
elif ifstat["mode"] == RNS.Interfaces.Interface.Interface.MODE_ROAMING:
|
|
||||||
modestr = "Roaming"
|
|
||||||
elif ifstat["mode"] == RNS.Interfaces.Interface.Interface.MODE_BOUNDARY:
|
|
||||||
modestr = "Boundary"
|
|
||||||
elif ifstat["mode"] == RNS.Interfaces.Interface.Interface.MODE_GATEWAY:
|
|
||||||
modestr = "Gateway"
|
|
||||||
else:
|
|
||||||
modestr = "Full"
|
|
||||||
|
|
||||||
|
|
||||||
if ifstat["clients"] != None:
|
|
||||||
clients = ifstat["clients"]
|
|
||||||
if name.startswith("Shared Instance["):
|
|
||||||
cnum = max(clients-1,0)
|
|
||||||
if cnum == 1:
|
|
||||||
spec_str = " program"
|
|
||||||
else:
|
|
||||||
spec_str = " programs"
|
|
||||||
|
|
||||||
clients_string = "Serving : "+str(cnum)+spec_str
|
|
||||||
elif name.startswith("I2PInterface["):
|
|
||||||
if "i2p_connectable" in ifstat and ifstat["i2p_connectable"] == True:
|
|
||||||
cnum = clients
|
|
||||||
if cnum == 1:
|
|
||||||
spec_str = " connected I2P endpoint"
|
|
||||||
else:
|
|
||||||
spec_str = " connected I2P endpoints"
|
|
||||||
|
|
||||||
clients_string = "Peers : "+str(cnum)+spec_str
|
|
||||||
else:
|
|
||||||
clients_string = ""
|
|
||||||
else:
|
|
||||||
clients_string = "Clients : "+str(clients)
|
|
||||||
|
|
||||||
else:
|
|
||||||
clients = None
|
|
||||||
|
|
||||||
print(" {n}".format(n=ifstat["name"]))
|
|
||||||
|
|
||||||
if "ifac_netname" in ifstat and ifstat["ifac_netname"] != None:
|
|
||||||
print(" Network : {nn}".format(nn=ifstat["ifac_netname"]))
|
|
||||||
|
|
||||||
print(" Status : {ss}".format(ss=ss))
|
|
||||||
|
|
||||||
if clients != None and clients_string != "":
|
|
||||||
print(" "+clients_string)
|
|
||||||
|
|
||||||
if not (name.startswith("Shared Instance[") or name.startswith("TCPInterface[Client") or name.startswith("LocalInterface[")):
|
|
||||||
print(" Mode : {mode}".format(mode=modestr))
|
|
||||||
|
|
||||||
if "bitrate" in ifstat and ifstat["bitrate"] != None:
|
|
||||||
print(" Rate : {ss}".format(ss=speed_str(ifstat["bitrate"])))
|
|
||||||
|
|
||||||
if "airtime_short" in ifstat and "airtime_long" in ifstat:
|
|
||||||
print(" Airtime : {ats}% (15s), {atl}% (1h)".format(ats=str(ifstat["airtime_short"]),atl=str(ifstat["airtime_long"])))
|
|
||||||
|
|
||||||
if "channel_load_short" in ifstat and "channel_load_long" in ifstat:
|
|
||||||
print(" Ch.Load : {ats}% (15s), {atl}% (1h)".format(ats=str(ifstat["channel_load_short"]),atl=str(ifstat["channel_load_long"])))
|
|
||||||
|
|
||||||
if "peers" in ifstat and ifstat["peers"] != None:
|
|
||||||
print(" Peers : {np} reachable".format(np=ifstat["peers"]))
|
|
||||||
|
|
||||||
if "tunnelstate" in ifstat and ifstat["tunnelstate"] != None:
|
|
||||||
print(" I2P : {ts}".format(ts=ifstat["tunnelstate"]))
|
|
||||||
|
|
||||||
if "ifac_signature" in ifstat and ifstat["ifac_signature"] != None:
|
|
||||||
sigstr = "<…"+RNS.hexrep(ifstat["ifac_signature"][-5:], delimit=False)+">"
|
|
||||||
print(" Access : {nb}-bit IFAC by {sig}".format(nb=ifstat["ifac_size"]*8, sig=sigstr))
|
|
||||||
|
|
||||||
if "i2p_b32" in ifstat and ifstat["i2p_b32"] != None:
|
|
||||||
print(" I2P B32 : {ep}".format(ep=str(ifstat["i2p_b32"])))
|
|
||||||
|
|
||||||
if astats and "announce_queue" in ifstat and ifstat["announce_queue"] != None and ifstat["announce_queue"] > 0:
|
|
||||||
aqn = ifstat["announce_queue"]
|
|
||||||
if aqn == 1:
|
|
||||||
print(" Queued : {np} announce".format(np=aqn))
|
|
||||||
else:
|
|
||||||
print(" Queued : {np} announces".format(np=aqn))
|
|
||||||
|
|
||||||
if astats and "held_announces" in ifstat and ifstat["held_announces"] != None and ifstat["held_announces"] > 0:
|
|
||||||
aqn = ifstat["held_announces"]
|
|
||||||
if aqn == 1:
|
|
||||||
print(" Held : {np} announce".format(np=aqn))
|
|
||||||
else:
|
|
||||||
print(" Held : {np} announces".format(np=aqn))
|
|
||||||
|
|
||||||
if astats and "incoming_announce_frequency" in ifstat and ifstat["incoming_announce_frequency"] != None:
|
|
||||||
print(" Announces : {iaf}↑".format(iaf=RNS.prettyfrequency(ifstat["outgoing_announce_frequency"])))
|
|
||||||
print(" {iaf}↓".format(iaf=RNS.prettyfrequency(ifstat["incoming_announce_frequency"])))
|
|
||||||
|
|
||||||
print(" Traffic : {txb}↑\n {rxb}↓".format(rxb=size_str(ifstat["rxb"]), txb=size_str(ifstat["txb"])))
|
|
||||||
|
|
||||||
if "transport_id" in stats and stats["transport_id"] != None:
|
|
||||||
print("\n Transport Instance "+RNS.prettyhexrep(stats["transport_id"])+" running")
|
|
||||||
if "probe_responder" in stats and stats["probe_responder"] != None:
|
|
||||||
print(" Probe responder at "+RNS.prettyhexrep(stats["probe_responder"])+ " active")
|
|
||||||
print(" Uptime is "+RNS.prettytime(stats["transport_uptime"]))
|
|
||||||
|
|
||||||
print("")
|
|
||||||
|
|
||||||
else:
|
|
||||||
print("Could not get RNS status")
|
print("Could not get RNS status")
|
||||||
|
return
|
||||||
|
|
||||||
|
if json:
|
||||||
|
import json
|
||||||
|
for s, value in stats.items():
|
||||||
|
stats[s] = convert_bytes_to_hex(value)
|
||||||
|
print(json.dumps(stats))
|
||||||
|
exit()
|
||||||
|
|
||||||
|
interfaces = stats["interfaces"]
|
||||||
|
if sorting is not None and isinstance(sorting, str):
|
||||||
|
sorting = sorting.lower()
|
||||||
|
if sorting == "rate" or sorting == "bitrate":
|
||||||
|
interfaces.sort(key=lambda i: i["bitrate"], reverse=not sort_reverse)
|
||||||
|
elif sorting == "rx":
|
||||||
|
interfaces.sort(key=lambda i: i["rxb"], reverse=not sort_reverse)
|
||||||
|
elif sorting == "tx":
|
||||||
|
interfaces.sort(key=lambda i: i["txb"], reverse=not sort_reverse)
|
||||||
|
elif sorting == "traffic":
|
||||||
|
interfaces.sort(key=lambda i: i["rxb"]+i["txb"], reverse=not sort_reverse)
|
||||||
|
elif sorting == "announces" or sorting == "announce":
|
||||||
|
interfaces.sort(key=lambda i: i["incoming_announce_frequency"]+i["outgoing_announce_frequency"], reverse=not sort_reverse)
|
||||||
|
elif sorting == "arx":
|
||||||
|
interfaces.sort(key=lambda i: i["incoming_announce_frequency"], reverse=not sort_reverse)
|
||||||
|
elif sorting == "atx":
|
||||||
|
interfaces.sort(key=lambda i: i["outgoing_announce_frequency"], reverse=not sort_reverse)
|
||||||
|
elif sorting == "held":
|
||||||
|
interfaces.sort(key=lambda i: i["held_announces"], reverse=not sort_reverse)
|
||||||
|
|
||||||
|
for ifstat in interfaces:
|
||||||
|
name = ifstat["name"]
|
||||||
|
|
||||||
|
if dispall or not (
|
||||||
|
name.startswith("LocalInterface[") or
|
||||||
|
name.startswith("TCPInterface[Client") or
|
||||||
|
name.startswith("I2PInterfacePeer[Connected peer") or
|
||||||
|
(name.startswith("I2PInterface[") and ("i2p_connectable" in ifstat and ifstat["i2p_connectable"] == False))
|
||||||
|
):
|
||||||
|
|
||||||
|
if not (name.startswith("I2PInterface[") and ("i2p_connectable" in ifstat and ifstat["i2p_connectable"] == False)):
|
||||||
|
if name_filter == None or name_filter.lower() in name.lower():
|
||||||
|
print("")
|
||||||
|
|
||||||
|
if ifstat["status"]:
|
||||||
|
ss = "Up"
|
||||||
|
else:
|
||||||
|
ss = "Down"
|
||||||
|
|
||||||
|
if ifstat["mode"] == RNS.Interfaces.Interface.Interface.MODE_ACCESS_POINT:
|
||||||
|
modestr = "Access Point"
|
||||||
|
elif ifstat["mode"] == RNS.Interfaces.Interface.Interface.MODE_POINT_TO_POINT:
|
||||||
|
modestr = "Point-to-Point"
|
||||||
|
elif ifstat["mode"] == RNS.Interfaces.Interface.Interface.MODE_ROAMING:
|
||||||
|
modestr = "Roaming"
|
||||||
|
elif ifstat["mode"] == RNS.Interfaces.Interface.Interface.MODE_BOUNDARY:
|
||||||
|
modestr = "Boundary"
|
||||||
|
elif ifstat["mode"] == RNS.Interfaces.Interface.Interface.MODE_GATEWAY:
|
||||||
|
modestr = "Gateway"
|
||||||
|
else:
|
||||||
|
modestr = "Full"
|
||||||
|
|
||||||
|
if ifstat["clients"] is not None:
|
||||||
|
clients = ifstat["clients"]
|
||||||
|
if name.startswith("Shared Instance["):
|
||||||
|
cnum = max(clients-1,0)
|
||||||
|
if cnum == 1:
|
||||||
|
spec_str = " program"
|
||||||
|
else:
|
||||||
|
spec_str = " programs"
|
||||||
|
|
||||||
|
clients_string = "Serving : "+str(cnum)+spec_str
|
||||||
|
elif name.startswith("I2PInterface["):
|
||||||
|
if "i2p_connectable" in ifstat and ifstat["i2p_connectable"] == True:
|
||||||
|
cnum = clients
|
||||||
|
if cnum == 1:
|
||||||
|
spec_str = " connected I2P endpoint"
|
||||||
|
else:
|
||||||
|
spec_str = " connected I2P endpoints"
|
||||||
|
|
||||||
|
clients_string = "Peers : "+str(cnum)+spec_str
|
||||||
|
else:
|
||||||
|
clients_string = ""
|
||||||
|
else:
|
||||||
|
clients_string = "Clients : "+str(clients)
|
||||||
|
|
||||||
|
else:
|
||||||
|
clients = None
|
||||||
|
|
||||||
|
print(" {n}".format(n=ifstat["name"]))
|
||||||
|
|
||||||
|
if "ifac_netname" in ifstat and ifstat["ifac_netname"] != None:
|
||||||
|
print(" Network : {nn}".format(nn=ifstat["ifac_netname"]))
|
||||||
|
|
||||||
|
print(" Status : {ss}".format(ss=ss))
|
||||||
|
|
||||||
|
if clients != None and clients_string != "":
|
||||||
|
print(" "+clients_string)
|
||||||
|
|
||||||
|
if not (name.startswith("Shared Instance[") or name.startswith("TCPInterface[Client") or name.startswith("LocalInterface[")):
|
||||||
|
print(" Mode : {mode}".format(mode=modestr))
|
||||||
|
|
||||||
|
if "bitrate" in ifstat and ifstat["bitrate"] != None:
|
||||||
|
print(" Rate : {ss}".format(ss=speed_str(ifstat["bitrate"])))
|
||||||
|
|
||||||
|
if "airtime_short" in ifstat and "airtime_long" in ifstat:
|
||||||
|
print(" Airtime : {ats}% (15s), {atl}% (1h)".format(ats=str(ifstat["airtime_short"]),atl=str(ifstat["airtime_long"])))
|
||||||
|
|
||||||
|
if "channel_load_short" in ifstat and "channel_load_long" in ifstat:
|
||||||
|
print(" Ch.Load : {ats}% (15s), {atl}% (1h)".format(ats=str(ifstat["channel_load_short"]),atl=str(ifstat["channel_load_long"])))
|
||||||
|
|
||||||
|
if "peers" in ifstat and ifstat["peers"] != None:
|
||||||
|
print(" Peers : {np} reachable".format(np=ifstat["peers"]))
|
||||||
|
|
||||||
|
if "tunnelstate" in ifstat and ifstat["tunnelstate"] != None:
|
||||||
|
print(" I2P : {ts}".format(ts=ifstat["tunnelstate"]))
|
||||||
|
|
||||||
|
if "ifac_signature" in ifstat and ifstat["ifac_signature"] != None:
|
||||||
|
sigstr = "<…"+RNS.hexrep(ifstat["ifac_signature"][-5:], delimit=False)+">"
|
||||||
|
print(" Access : {nb}-bit IFAC by {sig}".format(nb=ifstat["ifac_size"]*8, sig=sigstr))
|
||||||
|
|
||||||
|
if "i2p_b32" in ifstat and ifstat["i2p_b32"] != None:
|
||||||
|
print(" I2P B32 : {ep}".format(ep=str(ifstat["i2p_b32"])))
|
||||||
|
|
||||||
|
if astats and "announce_queue" in ifstat and ifstat["announce_queue"] != None and ifstat["announce_queue"] > 0:
|
||||||
|
aqn = ifstat["announce_queue"]
|
||||||
|
if aqn == 1:
|
||||||
|
print(" Queued : {np} announce".format(np=aqn))
|
||||||
|
else:
|
||||||
|
print(" Queued : {np} announces".format(np=aqn))
|
||||||
|
|
||||||
|
if astats and "held_announces" in ifstat and ifstat["held_announces"] != None and ifstat["held_announces"] > 0:
|
||||||
|
aqn = ifstat["held_announces"]
|
||||||
|
if aqn == 1:
|
||||||
|
print(" Held : {np} announce".format(np=aqn))
|
||||||
|
else:
|
||||||
|
print(" Held : {np} announces".format(np=aqn))
|
||||||
|
|
||||||
|
if astats and "incoming_announce_frequency" in ifstat and ifstat["incoming_announce_frequency"] != None:
|
||||||
|
print(" Announces : {iaf}↑".format(iaf=RNS.prettyfrequency(ifstat["outgoing_announce_frequency"])))
|
||||||
|
print(" {iaf}↓".format(iaf=RNS.prettyfrequency(ifstat["incoming_announce_frequency"])))
|
||||||
|
|
||||||
|
print(" Traffic : {txb}↑\n {rxb}↓".format(rxb=size_str(ifstat["rxb"]), txb=size_str(ifstat["txb"])))
|
||||||
|
|
||||||
|
if "transport_id" in stats and stats["transport_id"] != None:
|
||||||
|
print("\n Transport Instance "+RNS.prettyhexrep(stats["transport_id"])+" running")
|
||||||
|
if "probe_responder" in stats and stats["probe_responder"] != None:
|
||||||
|
print(" Probe responder at "+RNS.prettyhexrep(stats["probe_responder"])+ " active")
|
||||||
|
print(" Uptime is "+RNS.prettytime(stats["transport_uptime"]))
|
||||||
|
|
||||||
|
print("")
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
try:
|
try:
|
||||||
@ -232,7 +231,7 @@ def main():
|
|||||||
help="show all interfaces",
|
help="show all interfaces",
|
||||||
default=False
|
default=False
|
||||||
)
|
)
|
||||||
|
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"-A",
|
"-A",
|
||||||
"--announce-stats",
|
"--announce-stats",
|
||||||
@ -240,7 +239,7 @@ def main():
|
|||||||
help="show announce stats",
|
help="show announce stats",
|
||||||
default=False
|
default=False
|
||||||
)
|
)
|
||||||
|
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"-s",
|
"-s",
|
||||||
"--sort",
|
"--sort",
|
||||||
@ -249,7 +248,7 @@ def main():
|
|||||||
default=None,
|
default=None,
|
||||||
type=str
|
type=str
|
||||||
)
|
)
|
||||||
|
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"-r",
|
"-r",
|
||||||
"--reverse",
|
"--reverse",
|
||||||
@ -257,7 +256,7 @@ def main():
|
|||||||
help="reverse sorting",
|
help="reverse sorting",
|
||||||
default=False,
|
default=False,
|
||||||
)
|
)
|
||||||
|
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"-j",
|
"-j",
|
||||||
"--json",
|
"--json",
|
||||||
@ -269,7 +268,7 @@ def main():
|
|||||||
parser.add_argument('-v', '--verbose', action='count', default=0)
|
parser.add_argument('-v', '--verbose', action='count', default=0)
|
||||||
|
|
||||||
parser.add_argument("filter", nargs="?", default=None, help="only display interfaces with names including filter", type=str)
|
parser.add_argument("filter", nargs="?", default=None, help="only display interfaces with names including filter", type=str)
|
||||||
|
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
if args.config:
|
if args.config:
|
||||||
@ -292,6 +291,7 @@ def main():
|
|||||||
print("")
|
print("")
|
||||||
exit()
|
exit()
|
||||||
|
|
||||||
|
|
||||||
def speed_str(num, suffix='bps'):
|
def speed_str(num, suffix='bps'):
|
||||||
units = ['','k','M','G','T','P','E','Z']
|
units = ['','k','M','G','T','P','E','Z']
|
||||||
last_unit = 'Y'
|
last_unit = 'Y'
|
||||||
@ -308,5 +308,6 @@ def speed_str(num, suffix='bps'):
|
|||||||
|
|
||||||
return "%.2f %s%s" % (num, last_unit, suffix)
|
return "%.2f %s%s" % (num, last_unit, suffix)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
|
@ -28,7 +28,7 @@ import argparse
|
|||||||
import shlex
|
import shlex
|
||||||
import time
|
import time
|
||||||
import sys
|
import sys
|
||||||
import tty
|
# import tty # Commented this because commented lines below use it
|
||||||
import os
|
import os
|
||||||
|
|
||||||
from RNS._version import __version__
|
from RNS._version import __version__
|
||||||
@ -39,25 +39,27 @@ reticulum = None
|
|||||||
allow_all = False
|
allow_all = False
|
||||||
allowed_identity_hashes = []
|
allowed_identity_hashes = []
|
||||||
|
|
||||||
|
|
||||||
def prepare_identity(identity_path):
|
def prepare_identity(identity_path):
|
||||||
global identity
|
global identity
|
||||||
if identity_path == None:
|
if identity_path is None:
|
||||||
identity_path = RNS.Reticulum.identitypath+"/"+APP_NAME
|
identity_path = RNS.Reticulum.identitypath+"/"+APP_NAME
|
||||||
|
|
||||||
if os.path.isfile(identity_path):
|
if os.path.isfile(identity_path):
|
||||||
identity = RNS.Identity.from_file(identity_path)
|
identity = RNS.Identity.from_file(identity_path)
|
||||||
|
|
||||||
if identity == None:
|
if identity == None:
|
||||||
RNS.log("No valid saved identity found, creating new...", RNS.LOG_INFO)
|
RNS.log("No valid saved identity found, creating new...", RNS.LOG_INFO)
|
||||||
identity = RNS.Identity()
|
identity = RNS.Identity()
|
||||||
identity.to_file(identity_path)
|
identity.to_file(identity_path)
|
||||||
|
|
||||||
|
|
||||||
def listen(configdir, identitypath = None, verbosity = 0, quietness = 0, allowed = [], print_identity = False, disable_auth = None, disable_announce=False):
|
def listen(configdir, identitypath = None, verbosity = 0, quietness = 0, allowed = [], print_identity = False, disable_auth = None, disable_announce=False):
|
||||||
global identity, allow_all, allowed_identity_hashes, reticulum
|
global identity, allow_all, allowed_identity_hashes, reticulum
|
||||||
|
|
||||||
targetloglevel = 3+verbosity-quietness
|
targetloglevel = 3+verbosity-quietness
|
||||||
reticulum = RNS.Reticulum(configdir=configdir, loglevel=targetloglevel)
|
reticulum = RNS.Reticulum(configdir=configdir, loglevel=targetloglevel)
|
||||||
|
|
||||||
prepare_identity(identitypath)
|
prepare_identity(identitypath)
|
||||||
destination = RNS.Destination(identity, RNS.Destination.IN, RNS.Destination.SINGLE, APP_NAME, "execute")
|
destination = RNS.Destination(identity, RNS.Destination.IN, RNS.Destination.SINGLE, APP_NAME, "execute")
|
||||||
|
|
||||||
@ -69,7 +71,7 @@ def listen(configdir, identitypath = None, verbosity = 0, quietness = 0, allowed
|
|||||||
if disable_auth:
|
if disable_auth:
|
||||||
allow_all = True
|
allow_all = True
|
||||||
else:
|
else:
|
||||||
if allowed != None:
|
if allowed is not None:
|
||||||
for a in allowed:
|
for a in allowed:
|
||||||
try:
|
try:
|
||||||
dest_len = (RNS.Reticulum.TRUNCATED_HASHLENGTH//8)*2
|
dest_len = (RNS.Reticulum.TRUNCATED_HASHLENGTH//8)*2
|
||||||
@ -107,7 +109,7 @@ def listen(configdir, identitypath = None, verbosity = 0, quietness = 0, allowed
|
|||||||
|
|
||||||
if not disable_announce:
|
if not disable_announce:
|
||||||
destination.announce()
|
destination.announce()
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
|
|
||||||
@ -297,6 +299,7 @@ def remote_execution_progress(request_receipt):
|
|||||||
link = None
|
link = None
|
||||||
listener_destination = None
|
listener_destination = None
|
||||||
remote_exec_grace = 2.0
|
remote_exec_grace = 2.0
|
||||||
|
|
||||||
def execute(configdir, identitypath = None, verbosity = 0, quietness = 0, detailed = False, mirror = False, noid = False, destination = None, command = None, stdin = None, stdoutl = None, stderrl = None, timeout = RNS.Transport.PATH_REQUEST_TIMEOUT, result_timeout = None, interactive = False):
|
def execute(configdir, identitypath = None, verbosity = 0, quietness = 0, detailed = False, mirror = False, noid = False, destination = None, command = None, stdin = None, stdoutl = None, stderrl = None, timeout = RNS.Transport.PATH_REQUEST_TIMEOUT, result_timeout = None, interactive = False):
|
||||||
global identity, reticulum, link, listener_destination, remote_exec_grace
|
global identity, reticulum, link, listener_destination, remote_exec_grace
|
||||||
|
|
||||||
@ -338,7 +341,7 @@ def execute(configdir, identitypath = None, verbosity = 0, quietness = 0, detail
|
|||||||
if link == None or link.status == RNS.Link.CLOSED or link.status == RNS.Link.PENDING:
|
if link == None or link.status == RNS.Link.CLOSED or link.status == RNS.Link.PENDING:
|
||||||
link = RNS.Link(listener_destination)
|
link = RNS.Link(listener_destination)
|
||||||
link.did_identify = False
|
link.did_identify = False
|
||||||
|
|
||||||
if not spin(until=lambda: link.status == RNS.Link.ACTIVE, msg="Establishing link with "+RNS.prettyhexrep(destination_hash), timeout=timeout):
|
if not spin(until=lambda: link.status == RNS.Link.ACTIVE, msg="Establishing link with "+RNS.prettyhexrep(destination_hash), timeout=timeout):
|
||||||
print("Could not establish link with "+RNS.prettyhexrep(destination_hash))
|
print("Could not establish link with "+RNS.prettyhexrep(destination_hash))
|
||||||
exit(243)
|
exit(243)
|
||||||
@ -467,7 +470,7 @@ def execute(configdir, identitypath = None, verbosity = 0, quietness = 0, detail
|
|||||||
else:
|
else:
|
||||||
tstr = ""
|
tstr = ""
|
||||||
print("Remote wrote "+str(outlen)+" bytes to stdout"+tstr)
|
print("Remote wrote "+str(outlen)+" bytes to stdout"+tstr)
|
||||||
|
|
||||||
if errlen != None and stderr != None:
|
if errlen != None and stderr != None:
|
||||||
if len(stderr) < errlen:
|
if len(stderr) < errlen:
|
||||||
tstr = ", "+str(len(stderr))+" bytes displayed"
|
tstr = ", "+str(len(stderr))+" bytes displayed"
|
||||||
@ -548,7 +551,6 @@ def main():
|
|||||||
parser.add_argument("--stdout", action='store', default=None, help="max size in bytes of returned stdout", type=int)
|
parser.add_argument("--stdout", action='store', default=None, help="max size in bytes of returned stdout", type=int)
|
||||||
parser.add_argument("--stderr", action='store', default=None, help="max size in bytes of returned stderr", type=int)
|
parser.add_argument("--stderr", action='store', default=None, help="max size in bytes of returned stderr", type=int)
|
||||||
parser.add_argument("--version", action="version", version="rnx {version}".format(version=__version__))
|
parser.add_argument("--version", action="version", version="rnx {version}".format(version=__version__))
|
||||||
|
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
if args.listen or args.print_identity:
|
if args.listen or args.print_identity:
|
||||||
@ -600,8 +602,8 @@ def main():
|
|||||||
# while True:
|
# while True:
|
||||||
# ch = sys.stdin.read(1)
|
# ch = sys.stdin.read(1)
|
||||||
# cmdbuf += ch.encode("utf-8")
|
# cmdbuf += ch.encode("utf-8")
|
||||||
# print("\r"+prompt+cmdbuf.decode("utf-8"), end="")
|
# print("\r"+prompt+cmdbuf.decode("utf-8"), end="")
|
||||||
|
|
||||||
command = input()
|
command = input()
|
||||||
if command.lower() == "exit" or command.lower() == "quit":
|
if command.lower() == "exit" or command.lower() == "quit":
|
||||||
exit(0)
|
exit(0)
|
||||||
@ -668,6 +670,7 @@ def size_str(num, suffix='B'):
|
|||||||
|
|
||||||
return "%.2f%s%s" % (num, last_unit, suffix)
|
return "%.2f%s%s" % (num, last_unit, suffix)
|
||||||
|
|
||||||
|
|
||||||
def pretty_time(time, verbose=False):
|
def pretty_time(time, verbose=False):
|
||||||
days = int(time // (24 * 3600))
|
days = int(time // (24 * 3600))
|
||||||
time = time % (24 * 3600)
|
time = time % (24 * 3600)
|
||||||
@ -676,7 +679,7 @@ def pretty_time(time, verbose=False):
|
|||||||
minutes = int(time // 60)
|
minutes = int(time // 60)
|
||||||
time %= 60
|
time %= 60
|
||||||
seconds = round(time, 2)
|
seconds = round(time, 2)
|
||||||
|
|
||||||
ss = "" if seconds == 1 else "s"
|
ss = "" if seconds == 1 else "s"
|
||||||
sm = "" if minutes == 1 else "s"
|
sm = "" if minutes == 1 else "s"
|
||||||
sh = "" if hours == 1 else "s"
|
sh = "" if hours == 1 else "s"
|
||||||
@ -684,31 +687,24 @@ def pretty_time(time, verbose=False):
|
|||||||
|
|
||||||
components = []
|
components = []
|
||||||
if days > 0:
|
if days > 0:
|
||||||
components.append(str(days)+" day"+sd if verbose else str(days)+"d")
|
components.append("".join([str(days), " day", sd if verbose else str(days), "d"]))
|
||||||
|
|
||||||
if hours > 0:
|
if hours > 0:
|
||||||
components.append(str(hours)+" hour"+sh if verbose else str(hours)+"h")
|
components.append("".join([str(hours), " hour", sh if verbose else str(hours), "h"]))
|
||||||
|
|
||||||
if minutes > 0:
|
if minutes > 0:
|
||||||
components.append(str(minutes)+" minute"+sm if verbose else str(minutes)+"m")
|
components.append("".join([str(minutes), " minute", sm if verbose else str(minutes), "m"]))
|
||||||
|
|
||||||
if seconds > 0:
|
if seconds > 0:
|
||||||
components.append(str(seconds)+" second"+ss if verbose else str(seconds)+"s")
|
components.append("".join([str(seconds), " second", ss if verbose else str(seconds), "s"]))
|
||||||
|
|
||||||
i = 0
|
if len(components) > 1:
|
||||||
tstr = ""
|
time_string = "".join([", ".join(components[:-1]), " and ", components[-1]])
|
||||||
for c in components:
|
else:
|
||||||
i += 1
|
time_string = components[0] if components else ""
|
||||||
if i == 1:
|
|
||||||
pass
|
|
||||||
elif i < len(components):
|
|
||||||
tstr += ", "
|
|
||||||
elif i == len(components):
|
|
||||||
tstr += " and "
|
|
||||||
|
|
||||||
tstr += c
|
return time_string
|
||||||
|
|
||||||
return tstr
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
|
Binary file not shown.
Binary file not shown.
@ -1,4 +1,4 @@
|
|||||||
# Sphinx build info version 1
|
# Sphinx build info version 1
|
||||||
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
|
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
|
||||||
config: ca464cd1c1372d6c6fcf9792e89c3a3f
|
config: 541171817b95d649201365804faf729c
|
||||||
tags: 645f666f9bcd5a90fca523b33c5a78b7
|
tags: 645f666f9bcd5a90fca523b33c5a78b7
|
||||||
|
@ -180,29 +180,29 @@ and :ref:`Interfaces<interfaces-main>` chapters of this manual.
|
|||||||
Connecting Reticulum Instances Over the Internet
|
Connecting Reticulum Instances Over the Internet
|
||||||
================================================
|
================================================
|
||||||
Reticulum currently offers two interfaces suitable for connecting instances over the Internet: :ref:`TCP<interfaces-tcps>`
|
Reticulum currently offers two interfaces suitable for connecting instances over the Internet: :ref:`TCP<interfaces-tcps>`
|
||||||
and :ref:`I2P<interfaces-i2p>`. Each interface offers a different set of features, and Reticulum
|
and :ref:`I2P<interfaces-i2p>`. Each interface offers a different set of features, and Reticulum
|
||||||
users should carefully choose the interface which best suites their needs.
|
users should carefully choose the interface which best suites their needs.
|
||||||
|
|
||||||
The ``TCPServerInterface`` allows users to host an instance accessible over TCP/IP. This
|
The ``TCPServerInterface`` allows users to host an instance accessible over TCP/IP. This
|
||||||
method is generally faster, lower latency, and more energy efficient than using ``I2PInterface``,
|
method is generally faster, lower latency, and more energy efficient than using ``I2PInterface``,
|
||||||
however it also leaks more data about the server host.
|
however it also leaks more data about the server host.
|
||||||
|
|
||||||
TCP connections reveal the IP address of both your instance and the server to anyone who can
|
TCP connections reveal the IP address of both your instance and the server to anyone who can
|
||||||
inspect the connection. Someone could use this information to determine your location or identity. Adversaries
|
inspect the connection. Someone could use this information to determine your location or identity. Adversaries
|
||||||
inspecting your packets may be able to record packet metadata like time of transmission and packet size.
|
inspecting your packets may be able to record packet metadata like time of transmission and packet size.
|
||||||
Even though Reticulum encrypts traffic, TCP does not, so an adversary may be able to use
|
Even though Reticulum encrypts traffic, TCP does not, so an adversary may be able to use
|
||||||
packet inspection to learn that a system is running Reticulum, and what other IP addresses connect to it.
|
packet inspection to learn that a system is running Reticulum, and what other IP addresses connect to it.
|
||||||
Hosting a publicly reachable instance over TCP also requires a publicly reachable IP address,
|
Hosting a publicly reachable instance over TCP also requires a publicly reachable IP address,
|
||||||
which most Internet connections don't offer anymore.
|
which most Internet connections don't offer anymore.
|
||||||
|
|
||||||
The ``I2PInterface`` routes messages through the `Invisible Internet Protocol
|
The ``I2PInterface`` routes messages through the `Invisible Internet Protocol
|
||||||
(I2P) <https://geti2p.net/en/>`_. To use this interface, users must also run an I2P daemon in
|
(I2P) <https://geti2p.net/en/>`_. To use this interface, users must also run an I2P daemon in
|
||||||
parallel to ``rnsd``. For always-on I2P nodes it is recommended to use `i2pd <https://i2pd.website/>`_.
|
parallel to ``rnsd``. For always-on I2P nodes it is recommended to use `i2pd <https://i2pd.website/>`_.
|
||||||
|
|
||||||
By default, I2P will encrypt and mix all traffic sent over the Internet, and
|
By default, I2P will encrypt and mix all traffic sent over the Internet, and
|
||||||
hide both the sender and receiver Reticulum instance IP addresses. Running an I2P node
|
hide both the sender and receiver Reticulum instance IP addresses. Running an I2P node
|
||||||
will also relay other I2P user's encrypted packets, which will use extra
|
will also relay other I2P user's encrypted packets, which will use extra
|
||||||
bandwidth and compute power, but also makes timing attacks and other forms of
|
bandwidth and compute power, but also makes timing attacks and other forms of
|
||||||
deep-packet-inspection much more difficult.
|
deep-packet-inspection much more difficult.
|
||||||
|
|
||||||
I2P also allows users to host globally available Reticulum instances from non-public IP's and behind firewalls and NAT.
|
I2P also allows users to host globally available Reticulum instances from non-public IP's and behind firewalls and NAT.
|
||||||
@ -415,7 +415,7 @@ locally on your device using the following command:
|
|||||||
|
|
||||||
It is also possible to include Reticulum in apps compiled and distributed as
|
It is also possible to include Reticulum in apps compiled and distributed as
|
||||||
Android APKs. A detailed tutorial and example source code will be included
|
Android APKs. A detailed tutorial and example source code will be included
|
||||||
here at a later point. Until then you can use the `Sideband source code <https://github.com/markqvist/sideband>`_ as an example and startig point.
|
here at a later point. Until then you can use the `Sideband source code <https://github.com/markqvist/sideband>`_ as an example and starting point.
|
||||||
|
|
||||||
|
|
||||||
ARM64
|
ARM64
|
||||||
@ -455,7 +455,7 @@ for including and using Reticulum in your own scripts and programs.
|
|||||||
|
|
||||||
.. code::
|
.. code::
|
||||||
|
|
||||||
# Install pipx
|
# Install pipx
|
||||||
sudo apt install pipx
|
sudo apt install pipx
|
||||||
|
|
||||||
# Make installed programs available on the command line
|
# Make installed programs available on the command line
|
||||||
@ -489,7 +489,7 @@ for including and using Reticulum in your own scripts and programs.
|
|||||||
|
|
||||||
.. code::
|
.. code::
|
||||||
|
|
||||||
# Install pipx
|
# Install pipx
|
||||||
sudo apt install pipx
|
sudo apt install pipx
|
||||||
|
|
||||||
# Make installed programs available on the command line
|
# Make installed programs available on the command line
|
||||||
|
@ -33,9 +33,20 @@ system, which should be enabled by default in almost all OSes.
|
|||||||
|
|
||||||
.. code::
|
.. code::
|
||||||
|
|
||||||
# This example demonstrates a TCP server interface.
|
# This example demonstrates a bare-minimum setup
|
||||||
# It will listen for incoming connections on the
|
# of an Auto Interface. It will allow communica-
|
||||||
# specified IP address and port number.
|
# tion with all other reachable devices on all
|
||||||
|
# usable physical ethernet-based devices that
|
||||||
|
# are available on the system.
|
||||||
|
|
||||||
|
[[Default Interface]]
|
||||||
|
type = AutoInterface
|
||||||
|
interface_enabled = True
|
||||||
|
|
||||||
|
# This example demonstrates an more specifically
|
||||||
|
# configured Auto Interface, that only uses spe-
|
||||||
|
# cific physical interfaces, and has a number of
|
||||||
|
# other configuration options set.
|
||||||
|
|
||||||
[[Default Interface]]
|
[[Default Interface]]
|
||||||
type = AutoInterface
|
type = AutoInterface
|
||||||
|
134
docs/manual/_static/_sphinx_javascript_frameworks_compat.js
Normal file
134
docs/manual/_static/_sphinx_javascript_frameworks_compat.js
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
/*
|
||||||
|
* _sphinx_javascript_frameworks_compat.js
|
||||||
|
* ~~~~~~~~~~
|
||||||
|
*
|
||||||
|
* Compatability shim for jQuery and underscores.js.
|
||||||
|
*
|
||||||
|
* WILL BE REMOVED IN Sphinx 6.0
|
||||||
|
* xref RemovedInSphinx60Warning
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* select a different prefix for underscore
|
||||||
|
*/
|
||||||
|
$u = _.noConflict();
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* small helper function to urldecode strings
|
||||||
|
*
|
||||||
|
* See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL
|
||||||
|
*/
|
||||||
|
jQuery.urldecode = function(x) {
|
||||||
|
if (!x) {
|
||||||
|
return x
|
||||||
|
}
|
||||||
|
return decodeURIComponent(x.replace(/\+/g, ' '));
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* small helper function to urlencode strings
|
||||||
|
*/
|
||||||
|
jQuery.urlencode = encodeURIComponent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function returns the parsed url parameters of the
|
||||||
|
* current request. Multiple values per key are supported,
|
||||||
|
* it will always return arrays of strings for the value parts.
|
||||||
|
*/
|
||||||
|
jQuery.getQueryParameters = function(s) {
|
||||||
|
if (typeof s === 'undefined')
|
||||||
|
s = document.location.search;
|
||||||
|
var parts = s.substr(s.indexOf('?') + 1).split('&');
|
||||||
|
var result = {};
|
||||||
|
for (var i = 0; i < parts.length; i++) {
|
||||||
|
var tmp = parts[i].split('=', 2);
|
||||||
|
var key = jQuery.urldecode(tmp[0]);
|
||||||
|
var value = jQuery.urldecode(tmp[1]);
|
||||||
|
if (key in result)
|
||||||
|
result[key].push(value);
|
||||||
|
else
|
||||||
|
result[key] = [value];
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* highlight a given string on a jquery object by wrapping it in
|
||||||
|
* span elements with the given class name.
|
||||||
|
*/
|
||||||
|
jQuery.fn.highlightText = function(text, className) {
|
||||||
|
function highlight(node, addItems) {
|
||||||
|
if (node.nodeType === 3) {
|
||||||
|
var val = node.nodeValue;
|
||||||
|
var pos = val.toLowerCase().indexOf(text);
|
||||||
|
if (pos >= 0 &&
|
||||||
|
!jQuery(node.parentNode).hasClass(className) &&
|
||||||
|
!jQuery(node.parentNode).hasClass("nohighlight")) {
|
||||||
|
var span;
|
||||||
|
var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg");
|
||||||
|
if (isInSVG) {
|
||||||
|
span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
|
||||||
|
} else {
|
||||||
|
span = document.createElement("span");
|
||||||
|
span.className = className;
|
||||||
|
}
|
||||||
|
span.appendChild(document.createTextNode(val.substr(pos, text.length)));
|
||||||
|
node.parentNode.insertBefore(span, node.parentNode.insertBefore(
|
||||||
|
document.createTextNode(val.substr(pos + text.length)),
|
||||||
|
node.nextSibling));
|
||||||
|
node.nodeValue = val.substr(0, pos);
|
||||||
|
if (isInSVG) {
|
||||||
|
var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
|
||||||
|
var bbox = node.parentElement.getBBox();
|
||||||
|
rect.x.baseVal.value = bbox.x;
|
||||||
|
rect.y.baseVal.value = bbox.y;
|
||||||
|
rect.width.baseVal.value = bbox.width;
|
||||||
|
rect.height.baseVal.value = bbox.height;
|
||||||
|
rect.setAttribute('class', className);
|
||||||
|
addItems.push({
|
||||||
|
"parent": node.parentNode,
|
||||||
|
"target": rect});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!jQuery(node).is("button, select, textarea")) {
|
||||||
|
jQuery.each(node.childNodes, function() {
|
||||||
|
highlight(this, addItems);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var addItems = [];
|
||||||
|
var result = this.each(function() {
|
||||||
|
highlight(this, addItems);
|
||||||
|
});
|
||||||
|
for (var i = 0; i < addItems.length; ++i) {
|
||||||
|
jQuery(addItems[i].parent).before(addItems[i].target);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* backward compatibility for jQuery.browser
|
||||||
|
* This will be supported until firefox bug is fixed.
|
||||||
|
*/
|
||||||
|
if (!jQuery.browser) {
|
||||||
|
jQuery.uaMatch = function(ua) {
|
||||||
|
ua = ua.toLowerCase();
|
||||||
|
|
||||||
|
var match = /(chrome)[ \/]([\w.]+)/.exec(ua) ||
|
||||||
|
/(webkit)[ \/]([\w.]+)/.exec(ua) ||
|
||||||
|
/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) ||
|
||||||
|
/(msie) ([\w.]+)/.exec(ua) ||
|
||||||
|
ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) ||
|
||||||
|
[];
|
||||||
|
|
||||||
|
return {
|
||||||
|
browser: match[ 1 ] || "",
|
||||||
|
version: match[ 2 ] || "0"
|
||||||
|
};
|
||||||
|
};
|
||||||
|
jQuery.browser = {};
|
||||||
|
jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true;
|
||||||
|
}
|
@ -4,7 +4,7 @@
|
|||||||
*
|
*
|
||||||
* Sphinx stylesheet -- basic theme.
|
* Sphinx stylesheet -- basic theme.
|
||||||
*
|
*
|
||||||
* :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
|
* :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS.
|
||||||
* :license: BSD, see LICENSE for details.
|
* :license: BSD, see LICENSE for details.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@ -324,7 +324,6 @@ aside.sidebar {
|
|||||||
p.sidebar-title {
|
p.sidebar-title {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
|
||||||
nav.contents,
|
nav.contents,
|
||||||
aside.topic,
|
aside.topic,
|
||||||
div.admonition, div.topic, blockquote {
|
div.admonition, div.topic, blockquote {
|
||||||
@ -332,7 +331,6 @@ div.admonition, div.topic, blockquote {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -- topics ---------------------------------------------------------------- */
|
/* -- topics ---------------------------------------------------------------- */
|
||||||
|
|
||||||
nav.contents,
|
nav.contents,
|
||||||
aside.topic,
|
aside.topic,
|
||||||
div.topic {
|
div.topic {
|
||||||
@ -608,7 +606,6 @@ ol.simple p,
|
|||||||
ul.simple p {
|
ul.simple p {
|
||||||
margin-bottom: 0;
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
aside.footnote > span,
|
aside.footnote > span,
|
||||||
div.citation > span {
|
div.citation > span {
|
||||||
float: left;
|
float: left;
|
||||||
@ -670,16 +667,6 @@ dd {
|
|||||||
margin-left: 30px;
|
margin-left: 30px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sig dd {
|
|
||||||
margin-top: 0px;
|
|
||||||
margin-bottom: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.sig dl {
|
|
||||||
margin-top: 0px;
|
|
||||||
margin-bottom: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
dl > dd:last-child,
|
dl > dd:last-child,
|
||||||
dl > dd:last-child > :last-child {
|
dl > dd:last-child > :last-child {
|
||||||
margin-bottom: 0;
|
margin-bottom: 0;
|
||||||
@ -748,14 +735,6 @@ abbr, acronym {
|
|||||||
cursor: help;
|
cursor: help;
|
||||||
}
|
}
|
||||||
|
|
||||||
.translated {
|
|
||||||
background-color: rgba(207, 255, 207, 0.2)
|
|
||||||
}
|
|
||||||
|
|
||||||
.untranslated {
|
|
||||||
background-color: rgba(255, 207, 207, 0.2)
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -- code displays --------------------------------------------------------- */
|
/* -- code displays --------------------------------------------------------- */
|
||||||
|
|
||||||
pre {
|
pre {
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
*
|
*
|
||||||
* Base JavaScript utilities for all Sphinx HTML documentation.
|
* Base JavaScript utilities for all Sphinx HTML documentation.
|
||||||
*
|
*
|
||||||
* :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
|
* :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS.
|
||||||
* :license: BSD, see LICENSE for details.
|
* :license: BSD, see LICENSE for details.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
var DOCUMENTATION_OPTIONS = {
|
var DOCUMENTATION_OPTIONS = {
|
||||||
URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'),
|
URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'),
|
||||||
VERSION: '0.7.3 beta',
|
VERSION: '0.7.4 beta',
|
||||||
LANGUAGE: 'en',
|
LANGUAGE: 'en',
|
||||||
COLLAPSE_INDEX: false,
|
COLLAPSE_INDEX: false,
|
||||||
BUILDER: 'html',
|
BUILDER: 'html',
|
||||||
|
10881
docs/manual/_static/jquery-3.6.0.js
vendored
Normal file
10881
docs/manual/_static/jquery-3.6.0.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
2
docs/manual/_static/jquery.js
vendored
Normal file
2
docs/manual/_static/jquery.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@ -5,7 +5,7 @@
|
|||||||
* This script contains the language-specific data used by searchtools.js,
|
* This script contains the language-specific data used by searchtools.js,
|
||||||
* namely the list of stopwords, stemmer, scorer and splitter.
|
* namely the list of stopwords, stemmer, scorer and splitter.
|
||||||
*
|
*
|
||||||
* :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
|
* :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS.
|
||||||
* :license: BSD, see LICENSE for details.
|
* :license: BSD, see LICENSE for details.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
*
|
*
|
||||||
* Sphinx JavaScript utilities for the full-text search.
|
* Sphinx JavaScript utilities for the full-text search.
|
||||||
*
|
*
|
||||||
* :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
|
* :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS.
|
||||||
* :license: BSD, see LICENSE for details.
|
* :license: BSD, see LICENSE for details.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
2042
docs/manual/_static/underscore-1.13.1.js
Normal file
2042
docs/manual/_static/underscore-1.13.1.js
Normal file
File diff suppressed because it is too large
Load Diff
6
docs/manual/_static/underscore.js
Normal file
6
docs/manual/_static/underscore.js
Normal file
File diff suppressed because one or more lines are too long
@ -5,13 +5,13 @@
|
|||||||
<meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
|
<meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
|
||||||
<link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="Support Reticulum" href="support.html" /><link rel="prev" title="Building Networks" href="networks.html" />
|
<link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="Support Reticulum" href="support.html" /><link rel="prev" title="Building Networks" href="networks.html" />
|
||||||
|
|
||||||
<meta name="generator" content="sphinx-7.1.2, furo 2022.09.29.dev1"/>
|
<meta name="generator" content="sphinx-5.3.0, furo 2022.09.29.dev1"/>
|
||||||
<title>Code Examples - Reticulum Network Stack 0.7.3 beta documentation</title>
|
<title>Code Examples - Reticulum Network Stack 0.7.4 beta documentation</title>
|
||||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=a746c00c" />
|
<link rel="stylesheet" type="text/css" href="_static/pygments.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=189ec851f9bb375a2509b67be1f64f0cf212b702" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=189ec851f9bb375a2509b67be1f64f0cf212b702" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
<link rel="stylesheet" type="text/css" href="_static/copybutton.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/custom.css?v=bb3cebc5" />
|
<link rel="stylesheet" type="text/css" href="_static/custom.css" />
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -141,7 +141,7 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-center">
|
<div class="header-center">
|
||||||
<a href="index.html"><div class="brand">Reticulum Network Stack 0.7.3 beta documentation</div></a>
|
<a href="index.html"><div class="brand">Reticulum Network Stack 0.7.4 beta documentation</div></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-right">
|
<div class="header-right">
|
||||||
<div class="theme-toggle-container theme-toggle-header">
|
<div class="theme-toggle-container theme-toggle-header">
|
||||||
@ -161,13 +161,13 @@
|
|||||||
<aside class="sidebar-drawer">
|
<aside class="sidebar-drawer">
|
||||||
<div class="sidebar-container">
|
<div class="sidebar-container">
|
||||||
|
|
||||||
<div class="sidebar-sticky"><a class="sidebar-brand" href="index.html">
|
<div class="sidebar-sticky"><a class="sidebar-brand centered" href="index.html">
|
||||||
|
|
||||||
<div class="sidebar-logo-container">
|
<div class="sidebar-logo-container">
|
||||||
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span class="sidebar-brand-text">Reticulum Network Stack 0.7.3 beta documentation</span>
|
<span class="sidebar-brand-text">Reticulum Network Stack 0.7.4 beta documentation</span>
|
||||||
|
|
||||||
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
||||||
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
||||||
@ -656,6 +656,7 @@ the Packet interface.</p>
|
|||||||
<span class="c1"># of the packet. #</span>
|
<span class="c1"># of the packet. #</span>
|
||||||
<span class="c1">##########################################################</span>
|
<span class="c1">##########################################################</span>
|
||||||
|
|
||||||
|
<span class="kn">import</span> <span class="nn">os</span>
|
||||||
<span class="kn">import</span> <span class="nn">argparse</span>
|
<span class="kn">import</span> <span class="nn">argparse</span>
|
||||||
<span class="kn">import</span> <span class="nn">RNS</span>
|
<span class="kn">import</span> <span class="nn">RNS</span>
|
||||||
|
|
||||||
@ -678,8 +679,19 @@ the Packet interface.</p>
|
|||||||
<span class="c1"># We must first initialise Reticulum</span>
|
<span class="c1"># We must first initialise Reticulum</span>
|
||||||
<span class="n">reticulum</span> <span class="o">=</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Reticulum</span><span class="p">(</span><span class="n">configpath</span><span class="p">)</span>
|
<span class="n">reticulum</span> <span class="o">=</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Reticulum</span><span class="p">(</span><span class="n">configpath</span><span class="p">)</span>
|
||||||
|
|
||||||
<span class="c1"># Randomly create a new identity for our echo server</span>
|
<span class="c1"># Load identity from file if it exist or randomley create</span>
|
||||||
<span class="n">server_identity</span> <span class="o">=</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Identity</span><span class="p">()</span>
|
<span class="k">if</span> <span class="n">configpath</span><span class="p">:</span>
|
||||||
|
<span class="n">ifilepath</span> <span class="o">=</span> <span class="s2">"</span><span class="si">%s</span><span class="s2">/storage/identitiesy/</span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">configpath</span><span class="p">,</span><span class="n">APP_NAME</span><span class="p">)</span>
|
||||||
|
<span class="k">else</span><span class="p">:</span>
|
||||||
|
<span class="n">ifilepath</span> <span class="o">=</span> <span class="s2">"</span><span class="si">%s</span><span class="s2">/storage/identities/</span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">RNS</span><span class="o">.</span><span class="n">Reticulum</span><span class="o">.</span><span class="n">configdir</span><span class="p">,</span><span class="n">APP_NAME</span><span class="p">)</span>
|
||||||
|
<span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">ifilepath</span><span class="p">):</span>
|
||||||
|
<span class="c1"># Load identity from file</span>
|
||||||
|
<span class="n">server_identity</span> <span class="o">=</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Identity</span><span class="o">.</span><span class="n">from_file</span><span class="p">(</span><span class="n">ifilepath</span><span class="p">)</span>
|
||||||
|
<span class="n">RNS</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="s2">"loaded identity from file: "</span><span class="o">+</span><span class="n">ifilepath</span><span class="p">,</span> <span class="n">RNS</span><span class="o">.</span><span class="n">LOG_VERBOSE</span><span class="p">)</span>
|
||||||
|
<span class="k">else</span><span class="p">:</span>
|
||||||
|
<span class="c1"># Randomly create a new identity for our echo example</span>
|
||||||
|
<span class="n">server_identity</span> <span class="o">=</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Identity</span><span class="p">()</span>
|
||||||
|
<span class="n">RNS</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="s2">"created new identity"</span><span class="p">,</span> <span class="n">RNS</span><span class="o">.</span><span class="n">LOG_VERBOSE</span><span class="p">)</span>
|
||||||
|
|
||||||
<span class="c1"># We create a destination that clients can query. We want</span>
|
<span class="c1"># We create a destination that clients can query. We want</span>
|
||||||
<span class="c1"># to be able to verify echo replies to our clients, so we</span>
|
<span class="c1"># to be able to verify echo replies to our clients, so we</span>
|
||||||
@ -1018,8 +1030,20 @@ destination, and passing traffic back and forth over the link.</p>
|
|||||||
<span class="c1"># We must first initialise Reticulum</span>
|
<span class="c1"># We must first initialise Reticulum</span>
|
||||||
<span class="n">reticulum</span> <span class="o">=</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Reticulum</span><span class="p">(</span><span class="n">configpath</span><span class="p">)</span>
|
<span class="n">reticulum</span> <span class="o">=</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Reticulum</span><span class="p">(</span><span class="n">configpath</span><span class="p">)</span>
|
||||||
|
|
||||||
<span class="c1"># Randomly create a new identity for our link example</span>
|
<span class="c1"># Load identity from file if it exist or randomley create</span>
|
||||||
<span class="n">server_identity</span> <span class="o">=</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Identity</span><span class="p">()</span>
|
<span class="k">if</span> <span class="n">configpath</span><span class="p">:</span>
|
||||||
|
<span class="n">ifilepath</span> <span class="o">=</span> <span class="s2">"</span><span class="si">%s</span><span class="s2">/storage/identitiesy/</span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">configpath</span><span class="p">,</span><span class="n">APP_NAME</span><span class="p">)</span>
|
||||||
|
<span class="k">else</span><span class="p">:</span>
|
||||||
|
<span class="n">ifilepath</span> <span class="o">=</span> <span class="s2">"</span><span class="si">%s</span><span class="s2">/storage/identities/</span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">RNS</span><span class="o">.</span><span class="n">Reticulum</span><span class="o">.</span><span class="n">configdir</span><span class="p">,</span><span class="n">APP_NAME</span><span class="p">)</span>
|
||||||
|
<span class="n">RNS</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="s2">"ifilepath: </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="n">ifilepath</span><span class="p">)</span>
|
||||||
|
<span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">ifilepath</span><span class="p">):</span>
|
||||||
|
<span class="c1"># Load identity from file</span>
|
||||||
|
<span class="n">server_identity</span> <span class="o">=</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Identity</span><span class="o">.</span><span class="n">from_file</span><span class="p">(</span><span class="n">ifilepath</span><span class="p">)</span>
|
||||||
|
<span class="n">RNS</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="s2">"loaded identity from file: "</span><span class="o">+</span><span class="n">ifilepath</span><span class="p">,</span> <span class="n">RNS</span><span class="o">.</span><span class="n">LOG_VERBOSE</span><span class="p">)</span>
|
||||||
|
<span class="k">else</span><span class="p">:</span>
|
||||||
|
<span class="c1"># Randomly create a new identity for our link example</span>
|
||||||
|
<span class="n">server_identity</span> <span class="o">=</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Identity</span><span class="p">()</span>
|
||||||
|
<span class="n">RNS</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="s2">"created new identity"</span><span class="p">,</span> <span class="n">RNS</span><span class="o">.</span><span class="n">LOG_VERBOSE</span><span class="p">)</span>
|
||||||
|
|
||||||
<span class="c1"># We create a destination that clients can connect to. We</span>
|
<span class="c1"># We create a destination that clients can connect to. We</span>
|
||||||
<span class="c1"># want clients to create links to this destination, so we</span>
|
<span class="c1"># want clients to create links to this destination, so we</span>
|
||||||
@ -3321,11 +3345,14 @@ interface to efficiently pass files of any size over a Reticulum <a class="refer
|
|||||||
|
|
||||||
</aside>
|
</aside>
|
||||||
</div>
|
</div>
|
||||||
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js?v=cf108e5e"></script>
|
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
|
||||||
<script src="_static/doctools.js?v=888ff710"></script>
|
<script src="_static/jquery.js"></script>
|
||||||
<script src="_static/sphinx_highlight.js?v=4825356b"></script>
|
<script src="_static/underscore.js"></script>
|
||||||
<script src="_static/scripts/furo.js?v=2c7c1115"></script>
|
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script>
|
||||||
<script src="_static/clipboard.min.js?v=a7894cd8"></script>
|
<script src="_static/doctools.js"></script>
|
||||||
<script src="_static/copybutton.js?v=f281be69"></script>
|
<script src="_static/sphinx_highlight.js"></script>
|
||||||
|
<script src="_static/scripts/furo.js"></script>
|
||||||
|
<script src="_static/clipboard.min.js"></script>
|
||||||
|
<script src="_static/copybutton.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
@ -5,13 +5,13 @@
|
|||||||
<meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
|
<meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
|
||||||
<link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" />
|
<link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" />
|
||||||
|
|
||||||
<meta name="generator" content="sphinx-7.1.2, furo 2022.09.29.dev1"/>
|
<meta name="generator" content="sphinx-5.3.0, furo 2022.09.29.dev1"/>
|
||||||
<title>An Explanation of Reticulum for Human Beings - Reticulum Network Stack 0.7.3 beta documentation</title>
|
<title>An Explanation of Reticulum for Human Beings - Reticulum Network Stack 0.7.4 beta documentation</title>
|
||||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=a746c00c" />
|
<link rel="stylesheet" type="text/css" href="_static/pygments.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=189ec851f9bb375a2509b67be1f64f0cf212b702" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=189ec851f9bb375a2509b67be1f64f0cf212b702" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
<link rel="stylesheet" type="text/css" href="_static/copybutton.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/custom.css?v=bb3cebc5" />
|
<link rel="stylesheet" type="text/css" href="_static/custom.css" />
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -141,7 +141,7 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-center">
|
<div class="header-center">
|
||||||
<a href="index.html"><div class="brand">Reticulum Network Stack 0.7.3 beta documentation</div></a>
|
<a href="index.html"><div class="brand">Reticulum Network Stack 0.7.4 beta documentation</div></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-right">
|
<div class="header-right">
|
||||||
<div class="theme-toggle-container theme-toggle-header">
|
<div class="theme-toggle-container theme-toggle-header">
|
||||||
@ -161,13 +161,13 @@
|
|||||||
<aside class="sidebar-drawer">
|
<aside class="sidebar-drawer">
|
||||||
<div class="sidebar-container">
|
<div class="sidebar-container">
|
||||||
|
|
||||||
<div class="sidebar-sticky"><a class="sidebar-brand" href="index.html">
|
<div class="sidebar-sticky"><a class="sidebar-brand centered" href="index.html">
|
||||||
|
|
||||||
<div class="sidebar-logo-container">
|
<div class="sidebar-logo-container">
|
||||||
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span class="sidebar-brand-text">Reticulum Network Stack 0.7.3 beta documentation</span>
|
<span class="sidebar-brand-text">Reticulum Network Stack 0.7.4 beta documentation</span>
|
||||||
|
|
||||||
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
||||||
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
||||||
@ -257,11 +257,14 @@
|
|||||||
|
|
||||||
</aside>
|
</aside>
|
||||||
</div>
|
</div>
|
||||||
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js?v=cf108e5e"></script>
|
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
|
||||||
<script src="_static/doctools.js?v=888ff710"></script>
|
<script src="_static/jquery.js"></script>
|
||||||
<script src="_static/sphinx_highlight.js?v=4825356b"></script>
|
<script src="_static/underscore.js"></script>
|
||||||
<script src="_static/scripts/furo.js?v=2c7c1115"></script>
|
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script>
|
||||||
<script src="_static/clipboard.min.js?v=a7894cd8"></script>
|
<script src="_static/doctools.js"></script>
|
||||||
<script src="_static/copybutton.js?v=f281be69"></script>
|
<script src="_static/sphinx_highlight.js"></script>
|
||||||
|
<script src="_static/scripts/furo.js"></script>
|
||||||
|
<script src="_static/clipboard.min.js"></script>
|
||||||
|
<script src="_static/copybutton.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
@ -4,12 +4,12 @@
|
|||||||
<meta name="viewport" content="width=device-width,initial-scale=1"/>
|
<meta name="viewport" content="width=device-width,initial-scale=1"/>
|
||||||
<meta name="color-scheme" content="light dark"><link rel="index" title="Index" href="#" /><link rel="search" title="Search" href="search.html" />
|
<meta name="color-scheme" content="light dark"><link rel="index" title="Index" href="#" /><link rel="search" title="Search" href="search.html" />
|
||||||
|
|
||||||
<meta name="generator" content="sphinx-7.1.2, furo 2022.09.29.dev1"/><title>Index - Reticulum Network Stack 0.7.3 beta documentation</title>
|
<meta name="generator" content="sphinx-5.3.0, furo 2022.09.29.dev1"/><title>Index - Reticulum Network Stack 0.7.4 beta documentation</title>
|
||||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=a746c00c" />
|
<link rel="stylesheet" type="text/css" href="_static/pygments.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=189ec851f9bb375a2509b67be1f64f0cf212b702" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=189ec851f9bb375a2509b67be1f64f0cf212b702" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
<link rel="stylesheet" type="text/css" href="_static/copybutton.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/custom.css?v=bb3cebc5" />
|
<link rel="stylesheet" type="text/css" href="_static/custom.css" />
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -139,7 +139,7 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-center">
|
<div class="header-center">
|
||||||
<a href="index.html"><div class="brand">Reticulum Network Stack 0.7.3 beta documentation</div></a>
|
<a href="index.html"><div class="brand">Reticulum Network Stack 0.7.4 beta documentation</div></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-right">
|
<div class="header-right">
|
||||||
<div class="theme-toggle-container theme-toggle-header">
|
<div class="theme-toggle-container theme-toggle-header">
|
||||||
@ -159,13 +159,13 @@
|
|||||||
<aside class="sidebar-drawer">
|
<aside class="sidebar-drawer">
|
||||||
<div class="sidebar-container">
|
<div class="sidebar-container">
|
||||||
|
|
||||||
<div class="sidebar-sticky"><a class="sidebar-brand" href="index.html">
|
<div class="sidebar-sticky"><a class="sidebar-brand centered" href="index.html">
|
||||||
|
|
||||||
<div class="sidebar-logo-container">
|
<div class="sidebar-logo-container">
|
||||||
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span class="sidebar-brand-text">Reticulum Network Stack 0.7.3 beta documentation</span>
|
<span class="sidebar-brand-text">Reticulum Network Stack 0.7.4 beta documentation</span>
|
||||||
|
|
||||||
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
||||||
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
||||||
@ -737,11 +737,14 @@
|
|||||||
|
|
||||||
</aside>
|
</aside>
|
||||||
</div>
|
</div>
|
||||||
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js?v=cf108e5e"></script>
|
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
|
||||||
<script src="_static/doctools.js?v=888ff710"></script>
|
<script src="_static/jquery.js"></script>
|
||||||
<script src="_static/sphinx_highlight.js?v=4825356b"></script>
|
<script src="_static/underscore.js"></script>
|
||||||
<script src="_static/scripts/furo.js?v=2c7c1115"></script>
|
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script>
|
||||||
<script src="_static/clipboard.min.js?v=a7894cd8"></script>
|
<script src="_static/doctools.js"></script>
|
||||||
<script src="_static/copybutton.js?v=f281be69"></script>
|
<script src="_static/sphinx_highlight.js"></script>
|
||||||
|
<script src="_static/scripts/furo.js"></script>
|
||||||
|
<script src="_static/clipboard.min.js"></script>
|
||||||
|
<script src="_static/copybutton.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
@ -5,13 +5,13 @@
|
|||||||
<meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
|
<meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
|
||||||
<link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="Using Reticulum on Your System" href="using.html" /><link rel="prev" title="What is Reticulum?" href="whatis.html" />
|
<link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="Using Reticulum on Your System" href="using.html" /><link rel="prev" title="What is Reticulum?" href="whatis.html" />
|
||||||
|
|
||||||
<meta name="generator" content="sphinx-7.1.2, furo 2022.09.29.dev1"/>
|
<meta name="generator" content="sphinx-5.3.0, furo 2022.09.29.dev1"/>
|
||||||
<title>Getting Started Fast - Reticulum Network Stack 0.7.3 beta documentation</title>
|
<title>Getting Started Fast - Reticulum Network Stack 0.7.4 beta documentation</title>
|
||||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=a746c00c" />
|
<link rel="stylesheet" type="text/css" href="_static/pygments.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=189ec851f9bb375a2509b67be1f64f0cf212b702" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=189ec851f9bb375a2509b67be1f64f0cf212b702" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
<link rel="stylesheet" type="text/css" href="_static/copybutton.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/custom.css?v=bb3cebc5" />
|
<link rel="stylesheet" type="text/css" href="_static/custom.css" />
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -141,7 +141,7 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-center">
|
<div class="header-center">
|
||||||
<a href="index.html"><div class="brand">Reticulum Network Stack 0.7.3 beta documentation</div></a>
|
<a href="index.html"><div class="brand">Reticulum Network Stack 0.7.4 beta documentation</div></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-right">
|
<div class="header-right">
|
||||||
<div class="theme-toggle-container theme-toggle-header">
|
<div class="theme-toggle-container theme-toggle-header">
|
||||||
@ -161,13 +161,13 @@
|
|||||||
<aside class="sidebar-drawer">
|
<aside class="sidebar-drawer">
|
||||||
<div class="sidebar-container">
|
<div class="sidebar-container">
|
||||||
|
|
||||||
<div class="sidebar-sticky"><a class="sidebar-brand" href="index.html">
|
<div class="sidebar-sticky"><a class="sidebar-brand centered" href="index.html">
|
||||||
|
|
||||||
<div class="sidebar-logo-container">
|
<div class="sidebar-logo-container">
|
||||||
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span class="sidebar-brand-text">Reticulum Network Stack 0.7.3 beta documentation</span>
|
<span class="sidebar-brand-text">Reticulum Network Stack 0.7.4 beta documentation</span>
|
||||||
|
|
||||||
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
||||||
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
||||||
@ -560,7 +560,7 @@ locally on your device using the following command:</p>
|
|||||||
</div>
|
</div>
|
||||||
<p>It is also possible to include Reticulum in apps compiled and distributed as
|
<p>It is also possible to include Reticulum in apps compiled and distributed as
|
||||||
Android APKs. A detailed tutorial and example source code will be included
|
Android APKs. A detailed tutorial and example source code will be included
|
||||||
here at a later point. Until then you can use the <a class="reference external" href="https://github.com/markqvist/sideband">Sideband source code</a> as an example and startig point.</p>
|
here at a later point. Until then you can use the <a class="reference external" href="https://github.com/markqvist/sideband">Sideband source code</a> as an example and starting point.</p>
|
||||||
</section>
|
</section>
|
||||||
<section id="arm64">
|
<section id="arm64">
|
||||||
<h3>ARM64<a class="headerlink" href="#arm64" title="Permalink to this heading">#</a></h3>
|
<h3>ARM64<a class="headerlink" href="#arm64" title="Permalink to this heading">#</a></h3>
|
||||||
@ -758,11 +758,14 @@ section of this manual.</p>
|
|||||||
|
|
||||||
</aside>
|
</aside>
|
||||||
</div>
|
</div>
|
||||||
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js?v=cf108e5e"></script>
|
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
|
||||||
<script src="_static/doctools.js?v=888ff710"></script>
|
<script src="_static/jquery.js"></script>
|
||||||
<script src="_static/sphinx_highlight.js?v=4825356b"></script>
|
<script src="_static/underscore.js"></script>
|
||||||
<script src="_static/scripts/furo.js?v=2c7c1115"></script>
|
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script>
|
||||||
<script src="_static/clipboard.min.js?v=a7894cd8"></script>
|
<script src="_static/doctools.js"></script>
|
||||||
<script src="_static/copybutton.js?v=f281be69"></script>
|
<script src="_static/sphinx_highlight.js"></script>
|
||||||
|
<script src="_static/scripts/furo.js"></script>
|
||||||
|
<script src="_static/clipboard.min.js"></script>
|
||||||
|
<script src="_static/copybutton.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
@ -5,13 +5,13 @@
|
|||||||
<meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
|
<meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
|
||||||
<link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="Configuring Interfaces" href="interfaces.html" /><link rel="prev" title="Understanding Reticulum" href="understanding.html" />
|
<link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="Configuring Interfaces" href="interfaces.html" /><link rel="prev" title="Understanding Reticulum" href="understanding.html" />
|
||||||
|
|
||||||
<meta name="generator" content="sphinx-7.1.2, furo 2022.09.29.dev1"/>
|
<meta name="generator" content="sphinx-5.3.0, furo 2022.09.29.dev1"/>
|
||||||
<title>Communications Hardware - Reticulum Network Stack 0.7.3 beta documentation</title>
|
<title>Communications Hardware - Reticulum Network Stack 0.7.4 beta documentation</title>
|
||||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=a746c00c" />
|
<link rel="stylesheet" type="text/css" href="_static/pygments.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=189ec851f9bb375a2509b67be1f64f0cf212b702" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=189ec851f9bb375a2509b67be1f64f0cf212b702" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
<link rel="stylesheet" type="text/css" href="_static/copybutton.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/custom.css?v=bb3cebc5" />
|
<link rel="stylesheet" type="text/css" href="_static/custom.css" />
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -141,7 +141,7 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-center">
|
<div class="header-center">
|
||||||
<a href="index.html"><div class="brand">Reticulum Network Stack 0.7.3 beta documentation</div></a>
|
<a href="index.html"><div class="brand">Reticulum Network Stack 0.7.4 beta documentation</div></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-right">
|
<div class="header-right">
|
||||||
<div class="theme-toggle-container theme-toggle-header">
|
<div class="theme-toggle-container theme-toggle-header">
|
||||||
@ -161,13 +161,13 @@
|
|||||||
<aside class="sidebar-drawer">
|
<aside class="sidebar-drawer">
|
||||||
<div class="sidebar-container">
|
<div class="sidebar-container">
|
||||||
|
|
||||||
<div class="sidebar-sticky"><a class="sidebar-brand" href="index.html">
|
<div class="sidebar-sticky"><a class="sidebar-brand centered" href="index.html">
|
||||||
|
|
||||||
<div class="sidebar-logo-container">
|
<div class="sidebar-logo-container">
|
||||||
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span class="sidebar-brand-text">Reticulum Network Stack 0.7.3 beta documentation</span>
|
<span class="sidebar-brand-text">Reticulum Network Stack 0.7.4 beta documentation</span>
|
||||||
|
|
||||||
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
||||||
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
||||||
@ -519,11 +519,14 @@ can be used with Reticulum. This includes virtual software modems such as
|
|||||||
|
|
||||||
</aside>
|
</aside>
|
||||||
</div>
|
</div>
|
||||||
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js?v=cf108e5e"></script>
|
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
|
||||||
<script src="_static/doctools.js?v=888ff710"></script>
|
<script src="_static/jquery.js"></script>
|
||||||
<script src="_static/sphinx_highlight.js?v=4825356b"></script>
|
<script src="_static/underscore.js"></script>
|
||||||
<script src="_static/scripts/furo.js?v=2c7c1115"></script>
|
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script>
|
||||||
<script src="_static/clipboard.min.js?v=a7894cd8"></script>
|
<script src="_static/doctools.js"></script>
|
||||||
<script src="_static/copybutton.js?v=f281be69"></script>
|
<script src="_static/sphinx_highlight.js"></script>
|
||||||
|
<script src="_static/scripts/furo.js"></script>
|
||||||
|
<script src="_static/clipboard.min.js"></script>
|
||||||
|
<script src="_static/copybutton.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
@ -5,13 +5,13 @@
|
|||||||
<meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
|
<meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
|
||||||
<link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="What is Reticulum?" href="whatis.html" />
|
<link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="What is Reticulum?" href="whatis.html" />
|
||||||
|
|
||||||
<meta name="generator" content="sphinx-7.1.2, furo 2022.09.29.dev1"/>
|
<meta name="generator" content="sphinx-5.3.0, furo 2022.09.29.dev1"/>
|
||||||
<title>Reticulum Network Stack 0.7.3 beta documentation</title>
|
<title>Reticulum Network Stack 0.7.4 beta documentation</title>
|
||||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=a746c00c" />
|
<link rel="stylesheet" type="text/css" href="_static/pygments.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=189ec851f9bb375a2509b67be1f64f0cf212b702" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=189ec851f9bb375a2509b67be1f64f0cf212b702" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
<link rel="stylesheet" type="text/css" href="_static/copybutton.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/custom.css?v=bb3cebc5" />
|
<link rel="stylesheet" type="text/css" href="_static/custom.css" />
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -141,7 +141,7 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-center">
|
<div class="header-center">
|
||||||
<a href="#"><div class="brand">Reticulum Network Stack 0.7.3 beta documentation</div></a>
|
<a href="#"><div class="brand">Reticulum Network Stack 0.7.4 beta documentation</div></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-right">
|
<div class="header-right">
|
||||||
<div class="theme-toggle-container theme-toggle-header">
|
<div class="theme-toggle-container theme-toggle-header">
|
||||||
@ -161,13 +161,13 @@
|
|||||||
<aside class="sidebar-drawer">
|
<aside class="sidebar-drawer">
|
||||||
<div class="sidebar-container">
|
<div class="sidebar-container">
|
||||||
|
|
||||||
<div class="sidebar-sticky"><a class="sidebar-brand" href="#">
|
<div class="sidebar-sticky"><a class="sidebar-brand centered" href="#">
|
||||||
|
|
||||||
<div class="sidebar-logo-container">
|
<div class="sidebar-logo-container">
|
||||||
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span class="sidebar-brand-text">Reticulum Network Stack 0.7.3 beta documentation</span>
|
<span class="sidebar-brand-text">Reticulum Network Stack 0.7.4 beta documentation</span>
|
||||||
|
|
||||||
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
||||||
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
||||||
@ -468,11 +468,14 @@ to participate in the development of Reticulum itself.</p>
|
|||||||
|
|
||||||
</aside>
|
</aside>
|
||||||
</div>
|
</div>
|
||||||
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js?v=cf108e5e"></script>
|
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
|
||||||
<script src="_static/doctools.js?v=888ff710"></script>
|
<script src="_static/jquery.js"></script>
|
||||||
<script src="_static/sphinx_highlight.js?v=4825356b"></script>
|
<script src="_static/underscore.js"></script>
|
||||||
<script src="_static/scripts/furo.js?v=2c7c1115"></script>
|
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script>
|
||||||
<script src="_static/clipboard.min.js?v=a7894cd8"></script>
|
<script src="_static/doctools.js"></script>
|
||||||
<script src="_static/copybutton.js?v=f281be69"></script>
|
<script src="_static/sphinx_highlight.js"></script>
|
||||||
|
<script src="_static/scripts/furo.js"></script>
|
||||||
|
<script src="_static/clipboard.min.js"></script>
|
||||||
|
<script src="_static/copybutton.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
@ -5,13 +5,13 @@
|
|||||||
<meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
|
<meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
|
||||||
<link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="Building Networks" href="networks.html" /><link rel="prev" title="Communications Hardware" href="hardware.html" />
|
<link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="Building Networks" href="networks.html" /><link rel="prev" title="Communications Hardware" href="hardware.html" />
|
||||||
|
|
||||||
<meta name="generator" content="sphinx-7.1.2, furo 2022.09.29.dev1"/>
|
<meta name="generator" content="sphinx-5.3.0, furo 2022.09.29.dev1"/>
|
||||||
<title>Configuring Interfaces - Reticulum Network Stack 0.7.3 beta documentation</title>
|
<title>Configuring Interfaces - Reticulum Network Stack 0.7.4 beta documentation</title>
|
||||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=a746c00c" />
|
<link rel="stylesheet" type="text/css" href="_static/pygments.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=189ec851f9bb375a2509b67be1f64f0cf212b702" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=189ec851f9bb375a2509b67be1f64f0cf212b702" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
<link rel="stylesheet" type="text/css" href="_static/copybutton.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/custom.css?v=bb3cebc5" />
|
<link rel="stylesheet" type="text/css" href="_static/custom.css" />
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -141,7 +141,7 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-center">
|
<div class="header-center">
|
||||||
<a href="index.html"><div class="brand">Reticulum Network Stack 0.7.3 beta documentation</div></a>
|
<a href="index.html"><div class="brand">Reticulum Network Stack 0.7.4 beta documentation</div></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-right">
|
<div class="header-right">
|
||||||
<div class="theme-toggle-container theme-toggle-header">
|
<div class="theme-toggle-container theme-toggle-header">
|
||||||
@ -161,13 +161,13 @@
|
|||||||
<aside class="sidebar-drawer">
|
<aside class="sidebar-drawer">
|
||||||
<div class="sidebar-container">
|
<div class="sidebar-container">
|
||||||
|
|
||||||
<div class="sidebar-sticky"><a class="sidebar-brand" href="index.html">
|
<div class="sidebar-sticky"><a class="sidebar-brand centered" href="index.html">
|
||||||
|
|
||||||
<div class="sidebar-logo-container">
|
<div class="sidebar-logo-container">
|
||||||
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span class="sidebar-brand-text">Reticulum Network Stack 0.7.3 beta documentation</span>
|
<span class="sidebar-brand-text">Reticulum Network Stack 0.7.4 beta documentation</span>
|
||||||
|
|
||||||
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
||||||
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
||||||
@ -241,9 +241,20 @@ infrastructure like routers or DHCP servers, but will require at least some
|
|||||||
sort of switching medium between peers (a wired switch, a hub, a WiFi access
|
sort of switching medium between peers (a wired switch, a hub, a WiFi access
|
||||||
point or similar), and that link-local IPv6 is enabled in your operating
|
point or similar), and that link-local IPv6 is enabled in your operating
|
||||||
system, which should be enabled by default in almost all OSes.</p>
|
system, which should be enabled by default in almost all OSes.</p>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="c1"># This example demonstrates a TCP server interface.</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="c1"># This example demonstrates a bare-minimum setup</span>
|
||||||
<span class="c1"># It will listen for incoming connections on the</span>
|
<span class="c1"># of an Auto Interface. It will allow communica-</span>
|
||||||
<span class="c1"># specified IP address and port number.</span>
|
<span class="c1"># tion with all other reachable devices on all</span>
|
||||||
|
<span class="c1"># usable physical ethernet-based devices that</span>
|
||||||
|
<span class="c1"># are available on the system.</span>
|
||||||
|
|
||||||
|
<span class="p">[[</span><span class="n">Default</span> <span class="n">Interface</span><span class="p">]]</span>
|
||||||
|
<span class="nb">type</span> <span class="o">=</span> <span class="n">AutoInterface</span>
|
||||||
|
<span class="n">interface_enabled</span> <span class="o">=</span> <span class="kc">True</span>
|
||||||
|
|
||||||
|
<span class="c1"># This example demonstrates an more specifically</span>
|
||||||
|
<span class="c1"># configured Auto Interface, that only uses spe-</span>
|
||||||
|
<span class="c1"># cific physical interfaces, and has a number of</span>
|
||||||
|
<span class="c1"># other configuration options set.</span>
|
||||||
|
|
||||||
<span class="p">[[</span><span class="n">Default</span> <span class="n">Interface</span><span class="p">]]</span>
|
<span class="p">[[</span><span class="n">Default</span> <span class="n">Interface</span><span class="p">]]</span>
|
||||||
<span class="nb">type</span> <span class="o">=</span> <span class="n">AutoInterface</span>
|
<span class="nb">type</span> <span class="o">=</span> <span class="n">AutoInterface</span>
|
||||||
@ -255,6 +266,12 @@ system, which should be enabled by default in almost all OSes.</p>
|
|||||||
|
|
||||||
<span class="n">group_id</span> <span class="o">=</span> <span class="n">reticulum</span>
|
<span class="n">group_id</span> <span class="o">=</span> <span class="n">reticulum</span>
|
||||||
|
|
||||||
|
<span class="c1"># You can also choose the multicast address type:</span>
|
||||||
|
<span class="c1"># temporary (default, Temporary Multicast Address)</span>
|
||||||
|
<span class="c1"># or permanent (Permanent Multicast Address)</span>
|
||||||
|
|
||||||
|
<span class="n">multicast_address_type</span> <span class="o">=</span> <span class="n">permanent</span>
|
||||||
|
|
||||||
<span class="c1"># You can also select specifically which</span>
|
<span class="c1"># You can also select specifically which</span>
|
||||||
<span class="c1"># kernel networking devices to use.</span>
|
<span class="c1"># kernel networking devices to use.</span>
|
||||||
|
|
||||||
@ -1106,11 +1123,14 @@ to <code class="docutils literal notranslate"><span class="pre">30</span></code>
|
|||||||
|
|
||||||
</aside>
|
</aside>
|
||||||
</div>
|
</div>
|
||||||
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js?v=cf108e5e"></script>
|
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
|
||||||
<script src="_static/doctools.js?v=888ff710"></script>
|
<script src="_static/jquery.js"></script>
|
||||||
<script src="_static/sphinx_highlight.js?v=4825356b"></script>
|
<script src="_static/underscore.js"></script>
|
||||||
<script src="_static/scripts/furo.js?v=2c7c1115"></script>
|
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script>
|
||||||
<script src="_static/clipboard.min.js?v=a7894cd8"></script>
|
<script src="_static/doctools.js"></script>
|
||||||
<script src="_static/copybutton.js?v=f281be69"></script>
|
<script src="_static/sphinx_highlight.js"></script>
|
||||||
|
<script src="_static/scripts/furo.js"></script>
|
||||||
|
<script src="_static/clipboard.min.js"></script>
|
||||||
|
<script src="_static/copybutton.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
@ -5,13 +5,13 @@
|
|||||||
<meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
|
<meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
|
||||||
<link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="Code Examples" href="examples.html" /><link rel="prev" title="Configuring Interfaces" href="interfaces.html" />
|
<link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="Code Examples" href="examples.html" /><link rel="prev" title="Configuring Interfaces" href="interfaces.html" />
|
||||||
|
|
||||||
<meta name="generator" content="sphinx-7.1.2, furo 2022.09.29.dev1"/>
|
<meta name="generator" content="sphinx-5.3.0, furo 2022.09.29.dev1"/>
|
||||||
<title>Building Networks - Reticulum Network Stack 0.7.3 beta documentation</title>
|
<title>Building Networks - Reticulum Network Stack 0.7.4 beta documentation</title>
|
||||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=a746c00c" />
|
<link rel="stylesheet" type="text/css" href="_static/pygments.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=189ec851f9bb375a2509b67be1f64f0cf212b702" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=189ec851f9bb375a2509b67be1f64f0cf212b702" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
<link rel="stylesheet" type="text/css" href="_static/copybutton.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/custom.css?v=bb3cebc5" />
|
<link rel="stylesheet" type="text/css" href="_static/custom.css" />
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -141,7 +141,7 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-center">
|
<div class="header-center">
|
||||||
<a href="index.html"><div class="brand">Reticulum Network Stack 0.7.3 beta documentation</div></a>
|
<a href="index.html"><div class="brand">Reticulum Network Stack 0.7.4 beta documentation</div></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-right">
|
<div class="header-right">
|
||||||
<div class="theme-toggle-container theme-toggle-header">
|
<div class="theme-toggle-container theme-toggle-header">
|
||||||
@ -161,13 +161,13 @@
|
|||||||
<aside class="sidebar-drawer">
|
<aside class="sidebar-drawer">
|
||||||
<div class="sidebar-container">
|
<div class="sidebar-container">
|
||||||
|
|
||||||
<div class="sidebar-sticky"><a class="sidebar-brand" href="index.html">
|
<div class="sidebar-sticky"><a class="sidebar-brand centered" href="index.html">
|
||||||
|
|
||||||
<div class="sidebar-logo-container">
|
<div class="sidebar-logo-container">
|
||||||
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span class="sidebar-brand-text">Reticulum Network Stack 0.7.3 beta documentation</span>
|
<span class="sidebar-brand-text">Reticulum Network Stack 0.7.4 beta documentation</span>
|
||||||
|
|
||||||
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
||||||
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
||||||
@ -467,11 +467,14 @@ connected outliers are now an integral part of the network.</p>
|
|||||||
|
|
||||||
</aside>
|
</aside>
|
||||||
</div>
|
</div>
|
||||||
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js?v=cf108e5e"></script>
|
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
|
||||||
<script src="_static/doctools.js?v=888ff710"></script>
|
<script src="_static/jquery.js"></script>
|
||||||
<script src="_static/sphinx_highlight.js?v=4825356b"></script>
|
<script src="_static/underscore.js"></script>
|
||||||
<script src="_static/scripts/furo.js?v=2c7c1115"></script>
|
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script>
|
||||||
<script src="_static/clipboard.min.js?v=a7894cd8"></script>
|
<script src="_static/doctools.js"></script>
|
||||||
<script src="_static/copybutton.js?v=f281be69"></script>
|
<script src="_static/sphinx_highlight.js"></script>
|
||||||
|
<script src="_static/scripts/furo.js"></script>
|
||||||
|
<script src="_static/clipboard.min.js"></script>
|
||||||
|
<script src="_static/copybutton.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
Binary file not shown.
@ -5,13 +5,13 @@
|
|||||||
<meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
|
<meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
|
||||||
<link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="prev" title="Support Reticulum" href="support.html" />
|
<link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="prev" title="Support Reticulum" href="support.html" />
|
||||||
|
|
||||||
<meta name="generator" content="sphinx-7.1.2, furo 2022.09.29.dev1"/>
|
<meta name="generator" content="sphinx-5.3.0, furo 2022.09.29.dev1"/>
|
||||||
<title>API Reference - Reticulum Network Stack 0.7.3 beta documentation</title>
|
<title>API Reference - Reticulum Network Stack 0.7.4 beta documentation</title>
|
||||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=a746c00c" />
|
<link rel="stylesheet" type="text/css" href="_static/pygments.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=189ec851f9bb375a2509b67be1f64f0cf212b702" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=189ec851f9bb375a2509b67be1f64f0cf212b702" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
<link rel="stylesheet" type="text/css" href="_static/copybutton.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/custom.css?v=bb3cebc5" />
|
<link rel="stylesheet" type="text/css" href="_static/custom.css" />
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -141,7 +141,7 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-center">
|
<div class="header-center">
|
||||||
<a href="index.html"><div class="brand">Reticulum Network Stack 0.7.3 beta documentation</div></a>
|
<a href="index.html"><div class="brand">Reticulum Network Stack 0.7.4 beta documentation</div></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-right">
|
<div class="header-right">
|
||||||
<div class="theme-toggle-container theme-toggle-header">
|
<div class="theme-toggle-container theme-toggle-header">
|
||||||
@ -161,13 +161,13 @@
|
|||||||
<aside class="sidebar-drawer">
|
<aside class="sidebar-drawer">
|
||||||
<div class="sidebar-container">
|
<div class="sidebar-container">
|
||||||
|
|
||||||
<div class="sidebar-sticky"><a class="sidebar-brand" href="index.html">
|
<div class="sidebar-sticky"><a class="sidebar-brand centered" href="index.html">
|
||||||
|
|
||||||
<div class="sidebar-logo-container">
|
<div class="sidebar-logo-container">
|
||||||
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span class="sidebar-brand-text">Reticulum Network Stack 0.7.3 beta documentation</span>
|
<span class="sidebar-brand-text">Reticulum Network Stack 0.7.4 beta documentation</span>
|
||||||
|
|
||||||
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
||||||
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
||||||
@ -1605,7 +1605,7 @@ and <code class="docutils literal notranslate"><span class="pre">BufferedRWPair<
|
|||||||
<code class="docutils literal notranslate"><span class="pre">RawChannelReader</span></code> and <code class="docutils literal notranslate"><span class="pre">RawChannelWriter</span></code>.</p>
|
<code class="docutils literal notranslate"><span class="pre">RawChannelReader</span></code> and <code class="docutils literal notranslate"><span class="pre">RawChannelWriter</span></code>.</p>
|
||||||
<dl class="py method">
|
<dl class="py method">
|
||||||
<dt class="sig sig-object py" id="RNS.Buffer.create_reader">
|
<dt class="sig sig-object py" id="RNS.Buffer.create_reader">
|
||||||
<em class="property"><span class="pre">static</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">create_reader</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">stream_id</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">channel</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="#RNS.Channel.Channel" title="RNS.Channel.Channel"><span class="pre">Channel</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">ready_callback</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Callable</span><span class="p"><span class="pre">[</span></span><span class="p"><span class="pre">[</span></span><span class="pre">int</span><span class="p"><span class="pre">]</span></span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="pre">None</span><span class="p"><span class="pre">]</span></span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">→</span> <span class="sig-return-typehint"><span class="pre">BufferedReader</span></span></span><a class="headerlink" href="#RNS.Buffer.create_reader" title="Permalink to this definition">#</a></dt>
|
<em class="property"><span class="pre">static</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">create_reader</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">stream_id</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">channel</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="#RNS.Channel.Channel" title="RNS.Channel.Channel"><span class="pre">Channel</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">ready_callback</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">Callable</span><span class="p"><span class="pre">[</span></span><span class="p"><span class="pre">[</span></span><span class="pre">int</span><span class="p"><span class="pre">]</span></span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="pre">None</span><span class="p"><span class="pre">]</span></span><span class="p"><span class="pre">]</span></span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">→</span> <span class="sig-return-typehint"><span class="pre">BufferedReader</span></span></span><a class="headerlink" href="#RNS.Buffer.create_reader" title="Permalink to this definition">#</a></dt>
|
||||||
<dd><p>Create a buffered reader that reads binary data sent
|
<dd><p>Create a buffered reader that reads binary data sent
|
||||||
over a <code class="docutils literal notranslate"><span class="pre">Channel</span></code>, with an optional callback when
|
over a <code class="docutils literal notranslate"><span class="pre">Channel</span></code>, with an optional callback when
|
||||||
new data is available.</p>
|
new data is available.</p>
|
||||||
@ -1650,7 +1650,7 @@ of this object, see the Python documentation for
|
|||||||
|
|
||||||
<dl class="py method">
|
<dl class="py method">
|
||||||
<dt class="sig sig-object py" id="RNS.Buffer.create_bidirectional_buffer">
|
<dt class="sig sig-object py" id="RNS.Buffer.create_bidirectional_buffer">
|
||||||
<em class="property"><span class="pre">static</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">create_bidirectional_buffer</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">receive_stream_id</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">send_stream_id</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">channel</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="#RNS.Channel.Channel" title="RNS.Channel.Channel"><span class="pre">Channel</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">ready_callback</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Callable</span><span class="p"><span class="pre">[</span></span><span class="p"><span class="pre">[</span></span><span class="pre">int</span><span class="p"><span class="pre">]</span></span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="pre">None</span><span class="p"><span class="pre">]</span></span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">→</span> <span class="sig-return-typehint"><span class="pre">BufferedRWPair</span></span></span><a class="headerlink" href="#RNS.Buffer.create_bidirectional_buffer" title="Permalink to this definition">#</a></dt>
|
<em class="property"><span class="pre">static</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">create_bidirectional_buffer</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">receive_stream_id</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">send_stream_id</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">channel</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="#RNS.Channel.Channel" title="RNS.Channel.Channel"><span class="pre">Channel</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">ready_callback</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">Callable</span><span class="p"><span class="pre">[</span></span><span class="p"><span class="pre">[</span></span><span class="pre">int</span><span class="p"><span class="pre">]</span></span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="pre">None</span><span class="p"><span class="pre">]</span></span><span class="p"><span class="pre">]</span></span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">→</span> <span class="sig-return-typehint"><span class="pre">BufferedRWPair</span></span></span><a class="headerlink" href="#RNS.Buffer.create_bidirectional_buffer" title="Permalink to this definition">#</a></dt>
|
||||||
<dd><p>Create a buffered reader/writer pair that reads and
|
<dd><p>Create a buffered reader/writer pair that reads and
|
||||||
writes binary data over a <code class="docutils literal notranslate"><span class="pre">Channel</span></code>, with an
|
writes binary data over a <code class="docutils literal notranslate"><span class="pre">Channel</span></code>, with an
|
||||||
optional callback when new data is available.</p>
|
optional callback when new data is available.</p>
|
||||||
@ -2089,11 +2089,14 @@ will announce it.</p>
|
|||||||
|
|
||||||
</aside>
|
</aside>
|
||||||
</div>
|
</div>
|
||||||
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js?v=cf108e5e"></script>
|
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
|
||||||
<script src="_static/doctools.js?v=888ff710"></script>
|
<script src="_static/jquery.js"></script>
|
||||||
<script src="_static/sphinx_highlight.js?v=4825356b"></script>
|
<script src="_static/underscore.js"></script>
|
||||||
<script src="_static/scripts/furo.js?v=2c7c1115"></script>
|
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script>
|
||||||
<script src="_static/clipboard.min.js?v=a7894cd8"></script>
|
<script src="_static/doctools.js"></script>
|
||||||
<script src="_static/copybutton.js?v=f281be69"></script>
|
<script src="_static/sphinx_highlight.js"></script>
|
||||||
|
<script src="_static/scripts/furo.js"></script>
|
||||||
|
<script src="_static/clipboard.min.js"></script>
|
||||||
|
<script src="_static/copybutton.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
@ -4,11 +4,11 @@
|
|||||||
<meta name="viewport" content="width=device-width,initial-scale=1"/>
|
<meta name="viewport" content="width=device-width,initial-scale=1"/>
|
||||||
<meta name="color-scheme" content="light dark"><link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="#" />
|
<meta name="color-scheme" content="light dark"><link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="#" />
|
||||||
|
|
||||||
<meta name="generator" content="sphinx-7.1.2, furo 2022.09.29.dev1"/><title>Search - Reticulum Network Stack 0.7.3 beta documentation</title><link rel="stylesheet" type="text/css" href="_static/pygments.css?v=a746c00c" />
|
<meta name="generator" content="sphinx-5.3.0, furo 2022.09.29.dev1"/><title>Search - Reticulum Network Stack 0.7.4 beta documentation</title><link rel="stylesheet" type="text/css" href="_static/pygments.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=189ec851f9bb375a2509b67be1f64f0cf212b702" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=189ec851f9bb375a2509b67be1f64f0cf212b702" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
<link rel="stylesheet" type="text/css" href="_static/copybutton.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/custom.css?v=bb3cebc5" />
|
<link rel="stylesheet" type="text/css" href="_static/custom.css" />
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -138,7 +138,7 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-center">
|
<div class="header-center">
|
||||||
<a href="index.html"><div class="brand">Reticulum Network Stack 0.7.3 beta documentation</div></a>
|
<a href="index.html"><div class="brand">Reticulum Network Stack 0.7.4 beta documentation</div></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-right">
|
<div class="header-right">
|
||||||
<div class="theme-toggle-container theme-toggle-header">
|
<div class="theme-toggle-container theme-toggle-header">
|
||||||
@ -158,13 +158,13 @@
|
|||||||
<aside class="sidebar-drawer">
|
<aside class="sidebar-drawer">
|
||||||
<div class="sidebar-container">
|
<div class="sidebar-container">
|
||||||
|
|
||||||
<div class="sidebar-sticky"><a class="sidebar-brand" href="index.html">
|
<div class="sidebar-sticky"><a class="sidebar-brand centered" href="index.html">
|
||||||
|
|
||||||
<div class="sidebar-logo-container">
|
<div class="sidebar-logo-container">
|
||||||
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span class="sidebar-brand-text">Reticulum Network Stack 0.7.3 beta documentation</span>
|
<span class="sidebar-brand-text">Reticulum Network Stack 0.7.4 beta documentation</span>
|
||||||
|
|
||||||
</a><form class="sidebar-search-container" method="get" action="#" role="search">
|
</a><form class="sidebar-search-container" method="get" action="#" role="search">
|
||||||
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
||||||
@ -262,12 +262,15 @@
|
|||||||
|
|
||||||
</aside>
|
</aside>
|
||||||
</div>
|
</div>
|
||||||
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js?v=cf108e5e"></script>
|
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
|
||||||
<script src="_static/doctools.js?v=888ff710"></script>
|
<script src="_static/jquery.js"></script>
|
||||||
<script src="_static/sphinx_highlight.js?v=4825356b"></script>
|
<script src="_static/underscore.js"></script>
|
||||||
<script src="_static/scripts/furo.js?v=2c7c1115"></script>
|
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script>
|
||||||
<script src="_static/clipboard.min.js?v=a7894cd8"></script>
|
<script src="_static/doctools.js"></script>
|
||||||
<script src="_static/copybutton.js?v=f281be69"></script>
|
<script src="_static/sphinx_highlight.js"></script>
|
||||||
|
<script src="_static/scripts/furo.js"></script>
|
||||||
|
<script src="_static/clipboard.min.js"></script>
|
||||||
|
<script src="_static/copybutton.js"></script>
|
||||||
|
|
||||||
<script src="_static/searchtools.js"></script>
|
<script src="_static/searchtools.js"></script>
|
||||||
<script src="_static/language_data.js"></script>
|
<script src="_static/language_data.js"></script>
|
||||||
|
File diff suppressed because one or more lines are too long
@ -5,13 +5,13 @@
|
|||||||
<meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
|
<meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
|
||||||
<link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="API Reference" href="reference.html" /><link rel="prev" title="Code Examples" href="examples.html" />
|
<link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="API Reference" href="reference.html" /><link rel="prev" title="Code Examples" href="examples.html" />
|
||||||
|
|
||||||
<meta name="generator" content="sphinx-7.1.2, furo 2022.09.29.dev1"/>
|
<meta name="generator" content="sphinx-5.3.0, furo 2022.09.29.dev1"/>
|
||||||
<title>Support Reticulum - Reticulum Network Stack 0.7.3 beta documentation</title>
|
<title>Support Reticulum - Reticulum Network Stack 0.7.4 beta documentation</title>
|
||||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=a746c00c" />
|
<link rel="stylesheet" type="text/css" href="_static/pygments.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=189ec851f9bb375a2509b67be1f64f0cf212b702" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=189ec851f9bb375a2509b67be1f64f0cf212b702" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
<link rel="stylesheet" type="text/css" href="_static/copybutton.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/custom.css?v=bb3cebc5" />
|
<link rel="stylesheet" type="text/css" href="_static/custom.css" />
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -141,7 +141,7 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-center">
|
<div class="header-center">
|
||||||
<a href="index.html"><div class="brand">Reticulum Network Stack 0.7.3 beta documentation</div></a>
|
<a href="index.html"><div class="brand">Reticulum Network Stack 0.7.4 beta documentation</div></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-right">
|
<div class="header-right">
|
||||||
<div class="theme-toggle-container theme-toggle-header">
|
<div class="theme-toggle-container theme-toggle-header">
|
||||||
@ -161,13 +161,13 @@
|
|||||||
<aside class="sidebar-drawer">
|
<aside class="sidebar-drawer">
|
||||||
<div class="sidebar-container">
|
<div class="sidebar-container">
|
||||||
|
|
||||||
<div class="sidebar-sticky"><a class="sidebar-brand" href="index.html">
|
<div class="sidebar-sticky"><a class="sidebar-brand centered" href="index.html">
|
||||||
|
|
||||||
<div class="sidebar-logo-container">
|
<div class="sidebar-logo-container">
|
||||||
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span class="sidebar-brand-text">Reticulum Network Stack 0.7.3 beta documentation</span>
|
<span class="sidebar-brand-text">Reticulum Network Stack 0.7.4 beta documentation</span>
|
||||||
|
|
||||||
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
||||||
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
||||||
@ -330,11 +330,14 @@ report issues, suggest functionality and contribute code to Reticulum.</p>
|
|||||||
|
|
||||||
</aside>
|
</aside>
|
||||||
</div>
|
</div>
|
||||||
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js?v=cf108e5e"></script>
|
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
|
||||||
<script src="_static/doctools.js?v=888ff710"></script>
|
<script src="_static/jquery.js"></script>
|
||||||
<script src="_static/sphinx_highlight.js?v=4825356b"></script>
|
<script src="_static/underscore.js"></script>
|
||||||
<script src="_static/scripts/furo.js?v=2c7c1115"></script>
|
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script>
|
||||||
<script src="_static/clipboard.min.js?v=a7894cd8"></script>
|
<script src="_static/doctools.js"></script>
|
||||||
<script src="_static/copybutton.js?v=f281be69"></script>
|
<script src="_static/sphinx_highlight.js"></script>
|
||||||
|
<script src="_static/scripts/furo.js"></script>
|
||||||
|
<script src="_static/clipboard.min.js"></script>
|
||||||
|
<script src="_static/copybutton.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
@ -5,13 +5,13 @@
|
|||||||
<meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
|
<meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
|
||||||
<link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="Communications Hardware" href="hardware.html" /><link rel="prev" title="Using Reticulum on Your System" href="using.html" />
|
<link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="Communications Hardware" href="hardware.html" /><link rel="prev" title="Using Reticulum on Your System" href="using.html" />
|
||||||
|
|
||||||
<meta name="generator" content="sphinx-7.1.2, furo 2022.09.29.dev1"/>
|
<meta name="generator" content="sphinx-5.3.0, furo 2022.09.29.dev1"/>
|
||||||
<title>Understanding Reticulum - Reticulum Network Stack 0.7.3 beta documentation</title>
|
<title>Understanding Reticulum - Reticulum Network Stack 0.7.4 beta documentation</title>
|
||||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=a746c00c" />
|
<link rel="stylesheet" type="text/css" href="_static/pygments.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=189ec851f9bb375a2509b67be1f64f0cf212b702" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=189ec851f9bb375a2509b67be1f64f0cf212b702" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
<link rel="stylesheet" type="text/css" href="_static/copybutton.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/custom.css?v=bb3cebc5" />
|
<link rel="stylesheet" type="text/css" href="_static/custom.css" />
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -141,7 +141,7 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-center">
|
<div class="header-center">
|
||||||
<a href="index.html"><div class="brand">Reticulum Network Stack 0.7.3 beta documentation</div></a>
|
<a href="index.html"><div class="brand">Reticulum Network Stack 0.7.4 beta documentation</div></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-right">
|
<div class="header-right">
|
||||||
<div class="theme-toggle-container theme-toggle-header">
|
<div class="theme-toggle-container theme-toggle-header">
|
||||||
@ -161,13 +161,13 @@
|
|||||||
<aside class="sidebar-drawer">
|
<aside class="sidebar-drawer">
|
||||||
<div class="sidebar-container">
|
<div class="sidebar-container">
|
||||||
|
|
||||||
<div class="sidebar-sticky"><a class="sidebar-brand" href="index.html">
|
<div class="sidebar-sticky"><a class="sidebar-brand centered" href="index.html">
|
||||||
|
|
||||||
<div class="sidebar-logo-container">
|
<div class="sidebar-logo-container">
|
||||||
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span class="sidebar-brand-text">Reticulum Network Stack 0.7.3 beta documentation</span>
|
<span class="sidebar-brand-text">Reticulum Network Stack 0.7.4 beta documentation</span>
|
||||||
|
|
||||||
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
||||||
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
||||||
@ -1196,11 +1196,14 @@ those risks are acceptable to you.</p>
|
|||||||
|
|
||||||
</aside>
|
</aside>
|
||||||
</div>
|
</div>
|
||||||
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js?v=cf108e5e"></script>
|
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
|
||||||
<script src="_static/doctools.js?v=888ff710"></script>
|
<script src="_static/jquery.js"></script>
|
||||||
<script src="_static/sphinx_highlight.js?v=4825356b"></script>
|
<script src="_static/underscore.js"></script>
|
||||||
<script src="_static/scripts/furo.js?v=2c7c1115"></script>
|
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script>
|
||||||
<script src="_static/clipboard.min.js?v=a7894cd8"></script>
|
<script src="_static/doctools.js"></script>
|
||||||
<script src="_static/copybutton.js?v=f281be69"></script>
|
<script src="_static/sphinx_highlight.js"></script>
|
||||||
|
<script src="_static/scripts/furo.js"></script>
|
||||||
|
<script src="_static/clipboard.min.js"></script>
|
||||||
|
<script src="_static/copybutton.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
@ -5,13 +5,13 @@
|
|||||||
<meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
|
<meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
|
||||||
<link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="Understanding Reticulum" href="understanding.html" /><link rel="prev" title="Getting Started Fast" href="gettingstartedfast.html" />
|
<link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="Understanding Reticulum" href="understanding.html" /><link rel="prev" title="Getting Started Fast" href="gettingstartedfast.html" />
|
||||||
|
|
||||||
<meta name="generator" content="sphinx-7.1.2, furo 2022.09.29.dev1"/>
|
<meta name="generator" content="sphinx-5.3.0, furo 2022.09.29.dev1"/>
|
||||||
<title>Using Reticulum on Your System - Reticulum Network Stack 0.7.3 beta documentation</title>
|
<title>Using Reticulum on Your System - Reticulum Network Stack 0.7.4 beta documentation</title>
|
||||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=a746c00c" />
|
<link rel="stylesheet" type="text/css" href="_static/pygments.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=189ec851f9bb375a2509b67be1f64f0cf212b702" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=189ec851f9bb375a2509b67be1f64f0cf212b702" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
<link rel="stylesheet" type="text/css" href="_static/copybutton.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/custom.css?v=bb3cebc5" />
|
<link rel="stylesheet" type="text/css" href="_static/custom.css" />
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -141,7 +141,7 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-center">
|
<div class="header-center">
|
||||||
<a href="index.html"><div class="brand">Reticulum Network Stack 0.7.3 beta documentation</div></a>
|
<a href="index.html"><div class="brand">Reticulum Network Stack 0.7.4 beta documentation</div></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-right">
|
<div class="header-right">
|
||||||
<div class="theme-toggle-container theme-toggle-header">
|
<div class="theme-toggle-container theme-toggle-header">
|
||||||
@ -161,13 +161,13 @@
|
|||||||
<aside class="sidebar-drawer">
|
<aside class="sidebar-drawer">
|
||||||
<div class="sidebar-container">
|
<div class="sidebar-container">
|
||||||
|
|
||||||
<div class="sidebar-sticky"><a class="sidebar-brand" href="index.html">
|
<div class="sidebar-sticky"><a class="sidebar-brand centered" href="index.html">
|
||||||
|
|
||||||
<div class="sidebar-logo-container">
|
<div class="sidebar-logo-container">
|
||||||
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span class="sidebar-brand-text">Reticulum Network Stack 0.7.3 beta documentation</span>
|
<span class="sidebar-brand-text">Reticulum Network Stack 0.7.4 beta documentation</span>
|
||||||
|
|
||||||
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
||||||
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
||||||
@ -1057,11 +1057,14 @@ systemctl --user enable rnsd.service
|
|||||||
|
|
||||||
</aside>
|
</aside>
|
||||||
</div>
|
</div>
|
||||||
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js?v=cf108e5e"></script>
|
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
|
||||||
<script src="_static/doctools.js?v=888ff710"></script>
|
<script src="_static/jquery.js"></script>
|
||||||
<script src="_static/sphinx_highlight.js?v=4825356b"></script>
|
<script src="_static/underscore.js"></script>
|
||||||
<script src="_static/scripts/furo.js?v=2c7c1115"></script>
|
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script>
|
||||||
<script src="_static/clipboard.min.js?v=a7894cd8"></script>
|
<script src="_static/doctools.js"></script>
|
||||||
<script src="_static/copybutton.js?v=f281be69"></script>
|
<script src="_static/sphinx_highlight.js"></script>
|
||||||
|
<script src="_static/scripts/furo.js"></script>
|
||||||
|
<script src="_static/clipboard.min.js"></script>
|
||||||
|
<script src="_static/copybutton.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
@ -5,13 +5,13 @@
|
|||||||
<meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
|
<meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
|
||||||
<link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="Getting Started Fast" href="gettingstartedfast.html" /><link rel="prev" title="Reticulum Network Stack Manual" href="index.html" />
|
<link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="Getting Started Fast" href="gettingstartedfast.html" /><link rel="prev" title="Reticulum Network Stack Manual" href="index.html" />
|
||||||
|
|
||||||
<meta name="generator" content="sphinx-7.1.2, furo 2022.09.29.dev1"/>
|
<meta name="generator" content="sphinx-5.3.0, furo 2022.09.29.dev1"/>
|
||||||
<title>What is Reticulum? - Reticulum Network Stack 0.7.3 beta documentation</title>
|
<title>What is Reticulum? - Reticulum Network Stack 0.7.4 beta documentation</title>
|
||||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=a746c00c" />
|
<link rel="stylesheet" type="text/css" href="_static/pygments.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=189ec851f9bb375a2509b67be1f64f0cf212b702" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=189ec851f9bb375a2509b67be1f64f0cf212b702" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
<link rel="stylesheet" type="text/css" href="_static/copybutton.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/custom.css?v=bb3cebc5" />
|
<link rel="stylesheet" type="text/css" href="_static/custom.css" />
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -141,7 +141,7 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-center">
|
<div class="header-center">
|
||||||
<a href="index.html"><div class="brand">Reticulum Network Stack 0.7.3 beta documentation</div></a>
|
<a href="index.html"><div class="brand">Reticulum Network Stack 0.7.4 beta documentation</div></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-right">
|
<div class="header-right">
|
||||||
<div class="theme-toggle-container theme-toggle-header">
|
<div class="theme-toggle-container theme-toggle-header">
|
||||||
@ -161,13 +161,13 @@
|
|||||||
<aside class="sidebar-drawer">
|
<aside class="sidebar-drawer">
|
||||||
<div class="sidebar-container">
|
<div class="sidebar-container">
|
||||||
|
|
||||||
<div class="sidebar-sticky"><a class="sidebar-brand" href="index.html">
|
<div class="sidebar-sticky"><a class="sidebar-brand centered" href="index.html">
|
||||||
|
|
||||||
<div class="sidebar-logo-container">
|
<div class="sidebar-logo-container">
|
||||||
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span class="sidebar-brand-text">Reticulum Network Stack 0.7.3 beta documentation</span>
|
<span class="sidebar-brand-text">Reticulum Network Stack 0.7.4 beta documentation</span>
|
||||||
|
|
||||||
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
||||||
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
||||||
@ -434,11 +434,14 @@ want to help out with this, or can help sponsor an audit, please do get in touch
|
|||||||
|
|
||||||
</aside>
|
</aside>
|
||||||
</div>
|
</div>
|
||||||
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js?v=cf108e5e"></script>
|
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
|
||||||
<script src="_static/doctools.js?v=888ff710"></script>
|
<script src="_static/jquery.js"></script>
|
||||||
<script src="_static/sphinx_highlight.js?v=4825356b"></script>
|
<script src="_static/underscore.js"></script>
|
||||||
<script src="_static/scripts/furo.js?v=2c7c1115"></script>
|
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script>
|
||||||
<script src="_static/clipboard.min.js?v=a7894cd8"></script>
|
<script src="_static/doctools.js"></script>
|
||||||
<script src="_static/copybutton.js?v=f281be69"></script>
|
<script src="_static/sphinx_highlight.js"></script>
|
||||||
|
<script src="_static/scripts/furo.js"></script>
|
||||||
|
<script src="_static/clipboard.min.js"></script>
|
||||||
|
<script src="_static/copybutton.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
Loading…
Reference in New Issue
Block a user