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

1#!/usr/bin/env python3 

2""" 

3電磁弁の作動ログを WebUI で提供します。 

4 

5Usage: 

6 log_server.py [-c CONFIG] [-D] 

7 

8Options: 

9 -c CONFIG : CONFIG を設定ファイルとして読み込んで実行します。[default: config.yaml] 

10 -D : デバッグモードで動作します。 

11""" 

12 

13import logging 

14import threading 

15 

16import flask 

17import flask_cors 

18import werkzeug.serving 

19 

20 

21def create_app(config, event_queue): 

22 import my_lib.webapp.config 

23 

24 my_lib.webapp.config.URL_PREFIX = "/unit_cooler" 

25 my_lib.webapp.config.init(config["actuator"]["log_server"]) 

26 

27 import my_lib.webapp.base 

28 import my_lib.webapp.event 

29 import my_lib.webapp.log 

30 import my_lib.webapp.util 

31 

32 import unit_cooler.actuator.api.flow_status 

33 import unit_cooler.actuator.api.valve_status 

34 

35 # NOTE: アクセスログは無効にする 

36 logging.getLogger("werkzeug").setLevel(logging.ERROR) 

37 

38 app = flask.Flask("unit-cooler-log") 

39 

40 flask_cors.CORS(app) 

41 

42 app.config["CONFIG"] = config 

43 

44 app.json.compat = True 

45 

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) 

51 

52 my_lib.webapp.config.show_handler_list(app) 

53 

54 my_lib.webapp.log.init(config) 

55 my_lib.webapp.event.start(event_queue) 

56 

57 # app.debug = True 

58 

59 return app 

60 

61 

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) 

71 

72 logging.info("Start log server") 

73 

74 thread.start() 

75 

76 return { 

77 "server": server, 

78 "thread": thread, 

79 } 

80 

81 

82def term(handle): 

83 import my_lib.webapp.event 

84 

85 logging.warning("Stop log server") 

86 

87 my_lib.webapp.event.term() 

88 

89 handle["server"].shutdown() 

90 handle["server"].server_close() 

91 handle["thread"].join() 

92 

93 my_lib.webapp.log.term() 

94 

95 

96if __name__ == "__main__": 

97 # TEST Code 

98 import multiprocessing 

99 

100 import docopt 

101 import my_lib.config 

102 import my_lib.logger 

103 import my_lib.pretty 

104 

105 args = docopt.docopt(__doc__) 

106 

107 config_file = args["-c"] 

108 debug_mode = args["-D"] 

109 

110 my_lib.logger.init("test", level=logging.DEBUG if debug_mode else logging.INFO) 

111 

112 config = my_lib.config.load(config_file) 

113 event_queue = multiprocessing.Queue() 

114 

115 log_server_handle = start(config, event_queue)