From 2673b638bfb3543b38d6d9d0902e2f05be02b4d4 Mon Sep 17 00:00:00 2001 From: SpudGunMan Date: Thu, 8 Aug 2024 01:42:27 -0700 Subject: [PATCH] newidea --- config.template | 7 +++++ modules/settings.py | 3 ++ modules/system.py | 68 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+) diff --git a/config.template b/config.template index 0e71c2f..adece3e 100644 --- a/config.template +++ b/config.template @@ -89,3 +89,10 @@ signalHoldTime = 10 # the following are combined to reset the monitor signalCooldown = 5 signalCycleLimit = 5 + +[sentry] +sentry_enabled = True +# holdoff time multiplied by minutes(20) of the watchdog +sentry_holdoff = 9 +# channel to send a message to when the watchdog is triggered +secure_channel = 2 \ No newline at end of file diff --git a/modules/settings.py b/modules/settings.py index 30e93c7..ce16957 100644 --- a/modules/settings.py +++ b/modules/settings.py @@ -90,6 +90,9 @@ try: signalHoldTime = config['radioMon'].getint('signalHoldTime', 10) # default 10 seconds signalCooldown = config['radioMon'].getint('signalCooldown', 5) # default 1 second signalCycleLimit = config['radioMon'].getint('signalCycleLimit', 5) # default 5 cycles, used with SIGNAL_COOLDOWN + sentry_enabled = config['sentry'].getboolean('enabled', False) + secure_channel = config['sentry'].getint('secure_channel', 2) # default 2 + sentry_holdoff = config['sentry'].getint('holdoff', 9) # default 9 except KeyError as e: print(f"System: Error reading config file: {e}") print(f"System: Check the config.ini against config.template file for missing sections or values.") diff --git a/modules/system.py b/modules/system.py index 02f06a9..04c5a7e 100644 --- a/modules/system.py +++ b/modules/system.py @@ -275,6 +275,50 @@ def get_node_location(number, nodeInt=1, channel=0): else: logger.warning(f"System: No nodes found") return position + +def get_closest_nodes(nodeInt=1): + node_list = [] + if nodeInt == 1: + if interface1.nodes: + for node in interface1.nodes.values(): + if 'position' in node: + try: + latitude = node['position']['latitude'] + longitude = node['position']['longitude'] + except Exception as e: + logger.error(f"System: Error getting location data for {node['id']}. Error: {e}") + node_list.append({'id': node['id'], 'latitude': latitude, 'longitude': longitude}) + # else: + # # request location data + # try: + # logger.debug(f"System: Requesting location data for {node['id']}") + # interface1.sendPosition(destinationId=node['id'], wantResponse=False, channelIndex=publicChannel) + # except Exception as e: + # logger.error(f"System: Error requesting location data for {node['id']}. Error: {e}") + #sort by distance closest to lattitudeValue, longitudeValue + node_list.sort(key=lambda x: (x['latitude']-latitudeValue)**2 + (x['longitude']-longitudeValue)**2) + # return the 3 closest nodes + return node_list[:3] + else: + logger.error(f"System: No nodes found in closest_nodes on interface {nodeInt}") + return ERROR_FETCHING_DATA + if nodeInt == 2: + if interface2.nodes: + for node in interface2.nodes.values(): + if 'position' in node: + try: + latitude = node['position']['latitude'] + longitude = node['position']['longitude'] + except Exception as e: + logger.error(f"System: Error getting location data for {node['id']}. Error: {e}") + node_list.append({'id': node['id'], 'latitude': latitude, 'longitude': longitude}) + #sort by distance closest to lattitudeValue, longitudeValue + node_list.sort(key=lambda x: (x['latitude']-latitudeValue)**2 + (x['longitude']-longitudeValue)**2) + # return the 3 closest nodes + return node_list[:3] + else: + logger.error(f"System: No nodes found in closest_nodes on interface {nodeInt}") + return ERROR_FETCHING_DATA def send_message(message, ch, nodeid=0, nodeInt=1): if message == "": @@ -529,3 +573,27 @@ async def watchdog(): except Exception as e: logger.error(f"System: retrying interface2: {e}") + # Locate Closest Nodes and report them to a secure channel + sentry_enabled = True + secure_channel = 2 + if sentry_enabled: + try: + closest_nodes1 = get_closest_nodes(1) + if closest_nodes1 != ERROR_FETCHING_DATA: + for node in closest_nodes1: + if node is not None: + node_name = get_name_from_number(node['id'], 'long', 1) + send_message(f"{node_name} is close to your location", secure_channel, 0, 1) + logger.warning(f"System: {node_name} {node['id']} is close to your location on Interface1") + + if interface2_enabled: + closest_nodes2 = get_closest_nodes(2) + if closest_nodes2 != ERROR_FETCHING_DATA: + for node in closest_nodes2: + if node is not None: + node_name = get_name_from_number(node['id'], 'long', 2) + send_message(f"{node_name} is close to your location", secure_channel, 0, 2) + logger.warning(f"System: {node_name} {node['id']} is close to your location on Interface2") + except Exception as e: + logger.error(f"System: Sentry Error: {e}") +