Coverage for src/unit_cooler/actuator/log_server.py: 100%
43 statements
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-28 11:52 +0000
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-28 11:52 +0000
1#!/usr/bin/env python3
2"""
3電磁弁の作動ログを WebUI で提供します。
5Usage:
6 log_server.py [-c CONFIG] [-D]
8Options:
9 -c CONFIG : CONFIG を設定ファイルとして読み込んで実行します。[default: config.yaml]
10 -D : デバッグモードで動作します。
11"""
13import logging
14import threading
16import flask
17import flask_cors
18import werkzeug.serving
21def create_app(config, event_queue):
22 import my_lib.webapp.config
24 my_lib.webapp.config.URL_PREFIX = "/unit_cooler"
25 my_lib.webapp.config.init(config["actuator"]["log_server"])
27 import my_lib.webapp.base
28 import my_lib.webapp.event
29 import my_lib.webapp.log
30 import my_lib.webapp.util
32 import unit_cooler.actuator.api.flow_status
33 import unit_cooler.actuator.api.valve_status
35 # NOTE: アクセスログは無効にする
36 logging.getLogger("werkzeug").setLevel(logging.ERROR)
38 app = flask.Flask("unit-cooler-log")
40 flask_cors.CORS(app)
42 app.config["CONFIG"] = config
44 app.json.compat = True
46 app.register_blueprint(my_lib.webapp.log.blueprint)
47 app.register_blueprint(my_lib.webapp.event.blueprint)
48 app.register_blueprint(my_lib.webapp.util.blueprint)
49 app.register_blueprint(unit_cooler.actuator.api.valve_status.blueprint)
50 app.register_blueprint(unit_cooler.actuator.api.flow_status.blueprint)
52 my_lib.webapp.config.show_handler_list(app)
54 my_lib.webapp.log.init(config)
55 my_lib.webapp.event.start(event_queue)
57 # app.debug = True
59 return app
62def start(config, event_queue, port):
63 # NOTE: Flask は別のプロセスで実行
64 server = werkzeug.serving.make_server(
65 "0.0.0.0", # noqa: S104
66 port,
67 create_app(config, event_queue),
68 threaded=True,
69 )
70 thread = threading.Thread(target=server.serve_forever)
72 logging.info("Start log server")
74 thread.start()
76 return {
77 "server": server,
78 "thread": thread,
79 }
82def term(handle):
83 import my_lib.webapp.event
85 logging.warning("Stop log server")
87 my_lib.webapp.event.term()
89 handle["server"].shutdown()
90 handle["server"].server_close()
91 handle["thread"].join()
93 my_lib.webapp.log.term()
96if __name__ == "__main__":
97 # TEST Code
98 import multiprocessing
100 import docopt
101 import my_lib.config
102 import my_lib.logger
103 import my_lib.pretty
105 args = docopt.docopt(__doc__)
107 config_file = args["-c"]
108 debug_mode = args["-D"]
110 my_lib.logger.init("test", level=logging.DEBUG if debug_mode else logging.INFO)
112 config = my_lib.config.load(config_file)
113 event_queue = multiprocessing.Queue()
115 log_server_handle = start(config, event_queue)