@@ -396,3 +396,47 @@ def start_rest_api_server(host: str = "127.0.0.1", port: int = 9939,
396396
397397
398398__all__ = ["RestApiServer" , "start_rest_api_server" ]
399+
400+
401+ def _main (argv : Optional [list ] = None ) -> int :
402+ """Foreground entrypoint used by ``python -m je_auto_control.utils.rest_api.rest_server``.
403+
404+ Starts a :class:`RestApiServer` and blocks the main thread until
405+ SIGINT/SIGTERM. Token comes from ``AC_TOKEN`` if not given on the
406+ CLI so the container ENTRYPOINT can pass it via ``-e AC_TOKEN=…``.
407+ """
408+ import argparse
409+ import os
410+ import signal
411+ import time
412+
413+ parser = argparse .ArgumentParser (prog = "rest_server" )
414+ parser .add_argument ("--host" , default = "127.0.0.1" )
415+ parser .add_argument ("--port" , type = int , default = 9939 )
416+ parser .add_argument ("--token" , default = os .environ .get ("AC_TOKEN" ))
417+ parser .add_argument ("--no-audit" , action = "store_true" )
418+ args = parser .parse_args (argv )
419+
420+ server = start_rest_api_server (
421+ host = args .host , port = args .port ,
422+ token = args .token , enable_audit = not args .no_audit ,
423+ )
424+
425+ stop_event = threading .Event ()
426+
427+ def _handle_signal (_signum , _frame ):
428+ stop_event .set ()
429+
430+ signal .signal (signal .SIGINT , _handle_signal )
431+ signal .signal (signal .SIGTERM , _handle_signal )
432+
433+ try :
434+ while not stop_event .is_set ():
435+ time .sleep (0.5 )
436+ finally :
437+ server .stop ()
438+ return 0
439+
440+
441+ if __name__ == "__main__" :
442+ raise SystemExit (_main ())
0 commit comments