Coverage for src/webui.py: 0%

34 statements  

« prev     ^ index     » next       coverage.py v7.9.1, created at 2025-08-19 01:39 +0900

1#!/usr/bin/env python3 

2""" 

3電力計のデータ収集状況を表示する Web サーバです。 

4 

5Usage: 

6 webui.py [-c CONFIG] [-p PORT] [-D] 

7 

8Options: 

9 -c CONFIG : 通常モードで使う設定ファイルを指定します。[default: config.yaml] 

10 -p PORT : WEB サーバのポートを指定します。[default: 5000] 

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

12""" 

13 

14import logging 

15import pathlib 

16import signal 

17import sys 

18 

19import flask 

20import flask_cors 

21import my_lib.config 

22import my_lib.logger 

23 

24SCHEMA_CONFIG = "config.schema" 

25 

26 

27def term(): 

28 # 子プロセスを終了 

29 my_lib.proc_util.kill_child() 

30 

31 # プロセス終了 

32 logging.info("Graceful shutdown completed") 

33 sys.exit(0) 

34 

35 

36def sig_handler(num, frame): # noqa: ARG001 

37 logging.warning("receive signal %d", num) 

38 

39 if num in (signal.SIGTERM, signal.SIGINT): 

40 term() 

41 

42 

43def create_app(config): 

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

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

46 

47 import my_lib.webapp.config 

48 

49 my_lib.webapp.config.URL_PREFIX = "/wattmeter-sharp" 

50 my_lib.webapp.config.init(config) 

51 

52 import my_lib.webapp.base 

53 import my_lib.webapp.util 

54 

55 import sharp_hems.webui.webapi.sensor_stat 

56 

57 app = flask.Flask("wattmeter-sharp") 

58 

59 flask_cors.CORS(app) 

60 

61 app.config["CONFIG"] = config 

62 

63 app.register_blueprint(my_lib.webapp.base.blueprint, url_prefix=my_lib.webapp.config.URL_PREFIX) 

64 app.register_blueprint(my_lib.webapp.base.blueprint_default) 

65 app.register_blueprint(my_lib.webapp.util.blueprint, url_prefix=my_lib.webapp.config.URL_PREFIX) 

66 app.register_blueprint( 

67 sharp_hems.webui.webapi.sensor_stat.blueprint, url_prefix=my_lib.webapp.config.URL_PREFIX 

68 ) 

69 

70 my_lib.webapp.config.show_handler_list(app) 

71 

72 return app 

73 

74 

75if __name__ == "__main__": 

76 import docopt 

77 

78 args = docopt.docopt(__doc__) 

79 

80 config_file = args["-c"] 

81 port = args["-p"] 

82 debug_mode = args["-D"] 

83 

84 my_lib.logger.init("hems.wattmeter-sharp", level=logging.DEBUG if debug_mode else logging.INFO) 

85 

86 config = my_lib.config.load(config_file, pathlib.Path(SCHEMA_CONFIG)) 

87 

88 app = create_app(config) 

89 

90 signal.signal(signal.SIGTERM, sig_handler) 

91 

92 # Flaskアプリケーションを実行 

93 try: 

94 # NOTE: スクリプトの自動リロード停止したい場合は use_reloader=False にする 

95 app.run(host="0.0.0.0", port=port, threaded=True, use_reloader=True, debug=debug_mode) # noqa: S104 

96 except KeyboardInterrupt: 

97 logging.info("Received KeyboardInterrupt, shutting down...") 

98 sig_handler(signal.SIGINT, None)