Fix gateway exit code to enable systemd auto-restart on connection failure

- Updated the start_gateway function to return a boolean indicating success or failure, allowing for better control over exit codes.
- Modified the main function to handle gateway startup failures, ensuring systemd can automatically restart on transient errors.
- Enhanced error handling in the hermes_cli gateway to exit with code 1 if the gateway fails to connect to any platform.
This commit is contained in:
teknium1 2026-02-10 16:01:00 -08:00
parent 9b0f2a16ca
commit 62ba69a29d
2 changed files with 15 additions and 5 deletions

View file

@ -612,11 +612,13 @@ class GatewayRunner:
return response return response
async def start_gateway(config: Optional[GatewayConfig] = None) -> None: async def start_gateway(config: Optional[GatewayConfig] = None) -> bool:
""" """
Start the gateway and run until interrupted. Start the gateway and run until interrupted.
This is the main entry point for running the gateway. This is the main entry point for running the gateway.
Returns True if the gateway ran successfully, False if it failed to start.
A False return causes a non-zero exit code so systemd can auto-restart.
""" """
runner = GatewayRunner(config) runner = GatewayRunner(config)
@ -635,10 +637,11 @@ async def start_gateway(config: Optional[GatewayConfig] = None) -> None:
# Start the gateway # Start the gateway
success = await runner.start() success = await runner.start()
if not success: if not success:
return return False
# Wait for shutdown # Wait for shutdown
await runner.wait_for_shutdown() await runner.wait_for_shutdown()
return True
def main(): def main():
@ -658,8 +661,11 @@ def main():
data = json.load(f) data = json.load(f)
config = GatewayConfig.from_dict(data) config = GatewayConfig.from_dict(data)
# Run the gateway # Run the gateway - exit with code 1 if no platforms connected,
asyncio.run(start_gateway(config)) # so systemd Restart=on-failure will retry on transient errors (e.g. DNS)
success = asyncio.run(start_gateway(config))
if not success:
sys.exit(1)
if __name__ == "__main__": if __name__ == "__main__":

View file

@ -360,7 +360,11 @@ def run_gateway(verbose: bool = False):
print("└─────────────────────────────────────────────────────────┘") print("└─────────────────────────────────────────────────────────┘")
print() print()
asyncio.run(start_gateway()) # Exit with code 1 if gateway fails to connect any platform,
# so systemd Restart=on-failure will retry on transient errors
success = asyncio.run(start_gateway())
if not success:
sys.exit(1)
# ============================================================================= # =============================================================================