-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathrun_server.py
155 lines (131 loc) · 4.33 KB
/
run_server.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
import os
import argparse
import locale
import logging
import logging.config
import subprocess as sp
from gevent.pywsgi import WSGIServer
import requests
import server.config as config
try:
locale.setlocale(locale.LC_ALL, ("fr_FR", "UTF-8"))
except locale.Error:
pass
HERE = os.path.dirname(__file__)
logging.getLogger(__name__).addHandler(logging.NullHandler())
logging.config.dictConfig(
dict(
version=1,
formatters={
"message": {"format": "%(message)s"},
"date": {
"format": "[%(asctime)s][%(name)-12s][%(levelname)-8s] %(message)s"
},
},
handlers={
"console": {
"class": "logging.StreamHandler",
"formatter": "message",
"level": logging.DEBUG,
},
"file": {
"class": "logging.handlers.RotatingFileHandler",
"filename": config.ATELIER_LOG_PATH,
"formatter": "date",
"level": logging.INFO,
"maxBytes": 50000,
"backupCount": 3,
},
"file_server": {
"class": "logging.handlers.RotatingFileHandler",
"filename": os.path.join(HERE, "server.log"),
"formatter": "date",
"level": logging.INFO,
"maxBytes": 50000,
"backupCount": 1,
},
"file_scheduler": {
"class": "logging.handlers.RotatingFileHandler",
"filename": config.SCHEDULER_LOG_PATH,
"formatter": "date",
"level": logging.INFO,
"maxBytes": 50000,
"backupCount": 1,
},
"file_debug": {
"class": "logging.handlers.RotatingFileHandler",
"filename": config.CONTROLLINO_LOG_PATH,
"formatter": "message",
"level": logging.DEBUG,
"maxBytes": 50000000,
"backupCount": 1, # If zero, rollover never occurs
},
},
loggers={
"scheduler": {
"handlers": ["file_scheduler", "console"],
"level": logging.INFO,
},
"debug": {"handlers": ["file_debug"], "level": logging.DEBUG},
"atelier": {"handlers": ["file", "console"], "level": logging.DEBUG},
"server": {"handlers": ["file_server"], "level": logging.INFO},
},
)
)
logger = logging.getLogger("atelier")
server_logger = logging.getLogger("server")
try:
config.validate()
except Exception as e:
server_logger.error("Configuration invalide.", exc_info=e)
raise e
from server import alerts, arduino, db, scheduler, web
def remove_logging_handler(logger, handler_name):
for handler in logger.handlers:
if handler.name == handler_name:
logger.handlers.remove(handler)
return
def run_dev_server():
web.app.logger.setLevel(logging.DEBUG)
env = {**os.environ, "FLASK_APP": "server.web", "FLASK_DEBUG": "1"}
sp.run(["poetry", "run", "flask", "run"], check=True, env=env)
def run_prod_server(ip, port):
web.app.debug = False
web.app.logger.setLevel(logging.INFO)
http_server = WSGIServer(
listener=(ip, port),
application=web.app,
log=server_logger,
error_log=server_logger,
)
http_server.serve_forever()
def main():
parser = argparse.ArgumentParser()
parser.add_argument("--debug", action="store_true")
args = parser.parse_args()
if not args.debug:
remove_logging_handler(web.app.logger, "console")
remove_logging_handler(scheduler.logger, "console")
db.create_tables()
with web.app.app_context():
db.db.create_all()
try:
arduino.configure()
except requests.exceptions.RequestException as e:
logger.error(str(e), exc_info=e)
scheduler.run(min(10, config.get("server", "debug_period")))
alerts.raise_alert(
"startup",
"La Raspberry a redémarré, il semble y avoir eu une coupure de courant.",
0,
)
if args.debug:
run_dev_server()
else:
run_prod_server("", config.get("server", "port"))
if __name__ == "__main__":
try:
main()
except Exception as e:
logger.error(str(e), exc_info=e)
raise e