From 1f6560619e63649124d402d74099aa7fad25e932 Mon Sep 17 00:00:00 2001 From: Mark Qvist Date: Sun, 26 May 2024 01:28:40 +0200 Subject: [PATCH] Added link table stats to rnstatus --- RNS/Reticulum.py | 14 +++++++++++++- RNS/Utilities/rnstatus.py | 31 +++++++++++++++++++++++++++++-- 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/RNS/Reticulum.py b/RNS/Reticulum.py index 4a9bb9b..bbed1c4 100755 --- a/RNS/Reticulum.py +++ b/RNS/Reticulum.py @@ -1100,6 +1100,9 @@ class Reticulum: if path == "first_hop_timeout": rpc_connection.send(self.get_first_hop_timeout(call["destination_hash"])) + if path == "link_count": + rpc_connection.send(self.get_link_count()) + if path == "packet_rssi": rpc_connection.send(self.get_packet_rssi(call["packet_hash"])) @@ -1348,6 +1351,16 @@ class Reticulum: else: return RNS.Transport.next_hop(destination) + def get_link_count(self): + if self.is_connected_to_shared_instance: + rpc_connection = multiprocessing.connection.Client(self.rpc_addr, authkey=self.rpc_key) + rpc_connection.send({"get": "link_count"}) + response = rpc_connection.recv() + return response + + else: + return len(RNS.Transport.link_table) + def get_packet_rssi(self, packet_hash): if self.is_connected_to_shared_instance: rpc_connection = multiprocessing.connection.Client(self.rpc_addr, authkey=self.rpc_key) @@ -1376,7 +1389,6 @@ class Reticulum: return None - def get_packet_q(self, packet_hash): if self.is_connected_to_shared_instance: rpc_connection = multiprocessing.connection.Client(self.rpc_addr, authkey=self.rpc_key) diff --git a/RNS/Utilities/rnstatus.py b/RNS/Utilities/rnstatus.py index 835df74..4836348 100644 --- a/RNS/Utilities/rnstatus.py +++ b/RNS/Utilities/rnstatus.py @@ -46,9 +46,16 @@ def size_str(num, suffix='B'): return "%.2f%s%s" % (num, last_unit, suffix) -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, lstats=False, sorting=None, sort_reverse=False): reticulum = RNS.Reticulum(configdir = configdir, loglevel = 3+verbosity) + link_count = None + if lstats: + try: + link_count = reticulum.get_link_count() + except Exception as e: + pass + stats = None try: stats = reticulum.get_interface_stats() @@ -208,11 +215,22 @@ def program_setup(configdir, dispall=False, verbosity=0, name_filter=None, json= print(" Traffic : {txb}↑\n {rxb}↓".format(rxb=size_str(ifstat["rxb"]), txb=size_str(ifstat["txb"]))) + lstr = "" + if link_count != None and lstats: + ms = "y" if link_count == 1 else "ies" + if "transport_id" in stats and stats["transport_id"] != None: + lstr = f", {link_count} entr{ms} in link table" + else: + lstr = f" {link_count} entr{ms} in link table" + 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(" Uptime is "+RNS.prettytime(stats["transport_uptime"])+lstr) + else: + if lstr != "": + print(f"\n{lstr}") print("") @@ -241,6 +259,14 @@ def main(): default=False ) + parser.add_argument( + "-l", + "--link-stats", + action="store_true", + help="show link stats", + default=False, + ) + parser.add_argument( "-s", "--sort", @@ -284,6 +310,7 @@ def main(): name_filter=args.filter, json=args.json, astats=args.announce_stats, + lstats=args.link_stats, sorting=args.sort, sort_reverse=args.reverse, )