diff --git a/config.template b/config.template index 7febac7..6bd5286 100644 --- a/config.template +++ b/config.template @@ -87,6 +87,9 @@ sysloglevel = DEBUG # Number of log files to keep in days, 0 to keep all log_backup_count = 32 +#Do not retry enabling interface if it fails, just exit to let OS restart the bot +dont_retry_disconnect = False + [emergencyHandler] # enable or disable the emergency response handler enabled = False diff --git a/mesh_bot.py b/mesh_bot.py index 2238f1f..63bef74 100755 --- a/mesh_bot.py +++ b/mesh_bot.py @@ -1553,10 +1553,11 @@ async def main(): await asyncio.sleep(0.01) -try: - if __name__ == "__main__": +if __name__ == "__main__": + try: asyncio.run(main()) -except KeyboardInterrupt: - exit_handler() - pass + except KeyboardInterrupt: + exit_handler() + except SystemExit: + pass # EOF diff --git a/modules/settings.py b/modules/settings.py index c3e2cb9..e03c666 100644 --- a/modules/settings.py +++ b/modules/settings.py @@ -222,6 +222,7 @@ try: llmModel = config['general'].get('ollamaModel', 'gemma2:2b') # default gemma2:2b ollamaHostName = config['general'].get('ollamaHostName', 'http://localhost:11434') # default localhost llmReplyToNonCommands = config['general'].getboolean('llmReplyToNonCommands', True) + dont_retry_disconnect = config['general'].getboolean('dont_retry_disconnect', False) # default False, retry on disconnect # emergency response emergency_responder_enabled = config['emergencyHandler'].getboolean('enabled', False) emergency_responder_alert_channel = config['emergencyHandler'].getint('alert_channel', 2) # default 2 diff --git a/modules/system.py b/modules/system.py index 9e154ca..28fab8f 100644 --- a/modules/system.py +++ b/modules/system.py @@ -818,18 +818,7 @@ def handleAlertBroadcast(deviceID=1): def onDisconnect(interface): global retry_int1, retry_int2, retry_int3, retry_int4, retry_int5, retry_int6, retry_int7, retry_int8, retry_int9 - rxType = type(interface).__name__ - if rxType in ['SerialInterface', 'TCPInterface', 'BLEInterface']: - logger.critical(f"System: Lost Connection to Device {interface}") - for i in range(1, 10): - if globals().get(f'interface{i}_enabled'): - if globals().get(f'max_retry_count{i}') > 0: - retry_flag = globals().get(f'retry_int{i}') - if not retry_flag: - globals()[f'retry_int{i}'] = True - else: - logger.critical(f"System: Interface{i} {globals()[f'interface{i}']} failed to reconnect after multiple attempts. Exiting") - exit_handler() + interface.close() # Telemetry Functions telemetryData = {} @@ -1112,18 +1101,22 @@ async def retry_interface(nodeID): global max_retry_count1, max_retry_count2, max_retry_count3, max_retry_count4, max_retry_count5, max_retry_count6, max_retry_count7, max_retry_count8, max_retry_count9 interface = globals()[f'interface{nodeID}'] retry_int = globals()[f'retry_int{nodeID}'] - max_retry_count = globals()[f'max_retry_count{nodeID}'] + + if dont_retry_disconnect: + logger.critical(f"System: dont_retry_disconnect is set, not retrying interface{nodeID}") + exit_handler() if interface is not None: - retry_int = True - max_retry_count -= 1 + globals()[f'retry_int{nodeID}'] = True + globals()[f'max_retry_count{nodeID}'] -= 1 + logger.debug(f"System: Retrying interface{nodeID} {globals()[f'max_retry_count{nodeID}']} attempts left") try: interface.close() + logger.debug(f"System: Retrying interface{nodeID} in 15 seconds") except Exception as e: logger.error(f"System: closing interface{nodeID}: {e}") - logger.debug(f"System: Retrying interface{nodeID} in 15 seconds") - if max_retry_count == 0: + if globals()[f'max_retry_count{nodeID}'] == 0: logger.critical(f"System: Max retry count reached for interface{nodeID}") exit_handler() @@ -1133,13 +1126,15 @@ async def retry_interface(nodeID): if retry_int: interface = None globals()[f'interface{nodeID}'] = None - logger.debug(f"System: Retrying Interface{nodeID}") interface_type = globals()[f'interface{nodeID}_type'] if interface_type == 'serial': + logger.debug(f"System: Retrying Interface{nodeID} Serial on port: {globals().get(f'port{nodeID}')}") globals()[f'interface{nodeID}'] = meshtastic.serial_interface.SerialInterface(globals().get(f'port{nodeID}')) elif interface_type == 'tcp': - globals()[f'interface{nodeID}'] = meshtastic.tcp_interface.TCPInterface(globals().get(f'host{nodeID}')) + logger.debug(f"System: Retrying Interface{nodeID} TCP on hostname: {globals().get(f'hostname{nodeID}')}") + globals()[f'interface{nodeID}'] = meshtastic.tcp_interface.TCPInterface(globals().get(f'hostname{nodeID}')) elif interface_type == 'ble': + logger.debug(f"System: Retrying Interface{nodeID} BLE on mac: {globals().get(f'mac{nodeID}')}") globals()[f'interface{nodeID}'] = meshtastic.ble_interface.BLEInterface(globals().get(f'mac{nodeID}')) logger.debug(f"System: Interface{nodeID} Opened!") globals()[f'retry_int{nodeID}'] = False diff --git a/pong_bot.py b/pong_bot.py index 76f5b24..a703a7f 100755 --- a/pong_bot.py +++ b/pong_bot.py @@ -444,10 +444,11 @@ async def main(): await asyncio.sleep(0.01) -try: - if __name__ == "__main__": +if __name__ == "__main__": + try: asyncio.run(main()) -except KeyboardInterrupt: - exit_handler() - pass + except KeyboardInterrupt: + exit_handler() + except SystemExit: + pass # EOF