Terarea  2
The automation project
Loading...
Searching...
No Matches
bonus.py
Go to the documentation of this file.
1"""_summary_
2"""
3
4import signal
5from fastapi import Response, Request
6from display_tty import Disp, TOML_CONF, FILE_DESCRIPTOR, SAVE_TO_FILE, FILE_NAME
7from .. import constants as CONST
8from ..runtime_data import RuntimeData
9from ..http_codes import HCI
10
11
12class Bonus:
13 """_summary_
14 """
15
16 def __init__(self, runtime_data: RuntimeData, success: int = 0, error: int = 84, debug: bool = False) -> None:
17 """_summary_
18
19 Args:
20 runtime_data (RuntimeData): _description_
21 success (int, optional): _description_. Defaults to 0.
22 error (int, optional): _description_. Defaults to 84.
23 debug (bool, optional): _description_. Defaults to False.
24 """
25 self.debug: bool = debug
26 self.success: int = success
27 self.error: int = error
28 self.runtime_data_initialised: RuntimeData = runtime_data
29 self.disp: Disp = Disp(
30 TOML_CONF,
31 SAVE_TO_FILE,
32 FILE_NAME,
33 FILE_DESCRIPTOR,
34 debug=self.debug,
35 logger=self.__class__.__name__
36 )
37
38 def get_welcome(self, request: Request) -> Response:
39 """_summary_
40 The endpoint corresponding to '/'.
41
42 Returns:
43 Response: _description_: The data to send back to the user as a response.
44 """
45 title = "get_welcome"
46 token = self.runtime_data_initialised.boilerplate_incoming_initialised.get_token_if_present(
47 request)
48 self.disp.log_debug(f'(get_welcome) token = {token}', title)
49 body = self.runtime_data_initialised.boilerplate_responses_initialised.build_response_body(
50 title="Home",
51 message="Welcome to the control server.",
52 resp="",
53 token=token,
54 error=False
55 )
56 self.disp.log_debug(f"sent body : {body}", title)
57 self.disp.log_debug(
58 f"header = {self.runtime_data_initialised.json_header}", title
59 )
60 outgoing = HCI.success(
61 content=body,
62 content_type=CONST.CONTENT_TYPE,
63 headers=self.runtime_data_initialised.json_header
64 )
65 self.disp.log_debug(f"ready_to_go: {outgoing}", title)
66 return outgoing
67
68 def get_s3_bucket_names(self, request: Request) -> Response:
69 """
70 The endpoint to get every bucket data
71 """
72 title = "get_s3_bucket"
73 token = self.runtime_data_initialised.boilerplate_incoming_initialised.get_token_if_present(
74 request)
75 self.disp.log_debug(f"Token = {token}", title)
76 if token is None:
77 return self.runtime_data_initialised.boilerplate_responses_initialised.unauthorized(title, token)
78 bucket_names = self.runtime_data_initialised.bucket_link.get_bucket_names()
79 self.disp.log_debug(f"Bucket names: {bucket_names}", title)
80 if isinstance(bucket_names, int):
81 return self.runtime_data_initialised.boilerplate_responses_initialised.internal_server_error(title, token)
82 body = self.runtime_data_initialised.boilerplate_responses_initialised.build_response_body(
83 title=title,
84 message=bucket_names,
85 resp="success",
86 token=token,
87 error=False
88 )
89 return HCI.success(body, content_type=CONST.CONTENT_TYPE, headers=self.runtime_data_initialised.json_header)
90
91 def get_table(self, request: Request) -> Response:
92 """
93 table
94 """
95 title = "get_table"
96 token = self.runtime_data_initialised.boilerplate_incoming_initialised.get_token_if_present(
97 request)
98 self.disp.log_debug(f"Token = {token}", title)
99 if token is None:
100 body = self.runtime_data_initialised.boilerplate_responses_initialised.build_response_body(
101 title=title,
102 message="Authorisation required.",
103 resp="error",
104 token=token,
105 error=True
106 )
107 return HCI.unauthorized(body, content_type=CONST.CONTENT_TYPE, headers=self.runtime_data_initialised.json_header)
108 table = self.runtime_data_initialised.database_link.get_table_names()
109 self.disp.log_debug(f"received in {title}", table)
110 body = self.runtime_data_initialised.boilerplate_responses_initialised.build_response_body(
111 title=title,
112 message=table,
113 resp="success",
114 token=token,
115 error=False
116 )
117 return HCI.success(body, content_type=CONST.CONTENT_TYPE, headers=self.runtime_data_initialised.json_header)
118
119 async def post_stop_server(self, request: Request) -> Response:
120 """_summary_
121 The endpoint allowing a user to stop the server.
122
123 Returns:
124 Response: _description_: The data to send back to the user as a response.
125 """
126 title = "Stop server"
127 token = self.runtime_data_initialised.boilerplate_incoming_initialised.get_token_if_present(
128 request
129 )
130 if self.runtime_data_initialised.boilerplate_non_http_initialised.is_token_admin(token) is False:
131 self.disp.log_error(
132 "Non-admin user tried to stop the server.", title
133 )
134 body = self.runtime_data_initialised.boilerplate_responses_initialised.build_response_body(
135 title=title,
136 message="You do not have enough privileges to run this endpoint.",
137 resp="privilege to low",
138 token=token,
139 error=True
140 )
141 return HCI.unauthorized(content=body, content_type=CONST.CONTENT_TYPE, headers=self.runtime_data_initialised.json_header)
142 body = self.runtime_data_initialised.boilerplate_responses_initialised.build_response_body(
143 title=title,
144 message="The server is stopping",
145 resp="success",
146 token=token,
147 error=False
148 )
149 self.disp.log_debug("Server shutting down...", f"{title}")
150 self.runtime_data_initialised.server_running = False
151 self.runtime_data_initialised.continue_running = False
152 self.runtime_data_initialised.server.handle_exit(signal.SIGTERM, None)
153 status = self.runtime_data_initialised.background_tasks_initialised.safe_stop()
154 if status != self.success:
155 msg = "The server is stopping with errors, cron exited "
156 msg += f"with {status}."
157 self.disp.log_error(
158 msg,
159 "post_stop_server"
160 )
161 body = self.runtime_data_initialised.boilerplate_responses_initialised.build_response_body(
162 title=title,
163 message=msg,
164 resp="error",
165 token=token,
166 error=True
167 )
168 del self.runtime_data_initialised.background_tasks_initialised
169 self.runtime_data_initialised.background_tasks_initialised = None
170 return HCI.internal_server_error(content=body, content_type=CONST.CONTENT_TYPE, headers=self.runtime_data_initialised.json_header)
171 return HCI.success(content=body, content_type=CONST.CONTENT_TYPE, headers=self.runtime_data_initialised.json_header)
172
173 async def trigger_endpoint(self, id: str, request: Request) -> Response:
174 """_summary_
175 The endpoint to trigger a specific action.
176
177 Args:
178 id (str): _description_
179 request (Request): _description_
180
181 Returns:
182 Response: _description_
183 """
184 title = "trigger_endpoint"
185 token = self.runtime_data_initialised.boilerplate_incoming_initialised.get_token_if_present(
186 request
187 )
188 if token is None:
189 return self.runtime_data_initialised.boilerplate_responses_initialised.invalid_token(title)
190 if self.runtime_data_initialised.boilerplate_non_http_initialised.is_token_admin(token) is False:
191 self.disp.log_error(
192 "Non-admin user tried to trigger an action.", title
193 )
194 return self.runtime_data_initialised.boilerplate_responses_initialised.insuffisant_rights(
195 title, token
196 )
197 node = self.runtime_data_initialised.database_link.get_data_from_table(
198 CONST.TAB_ACTIONS,
199 column="*",
200 where=f"id='{id}'",
201 beautify=True
202 )
203 if isinstance(node, int):
204 body = self.runtime_data_initialised.boilerplate_responses_initialised.build_response_body(
205 title=title,
206 message=f"The action {id} does not exist.",
207 resp="error",
208 token=token,
209 error=True
210 )
211 return HCI.not_found(body, content_type=CONST.CONTENT_TYPE, headers=self.runtime_data_initialised.json_header)
212 data = self.runtime_data_initialised.actions_main_initialised.process_action_node(
213 id
214 )
215 run_data = self.runtime_data_initialised.actions_main_initialised.logger.get_logs(
216 id, beautify=True
217 )
218 self.disp.log_debug(f"run_data = {run_data}", title)
219 run_data = self.runtime_data_initialised.actions_main_initialised.variables.sanitize_for_json(
220 run_data, False
221 )
222 self.disp.log_debug(f"run_data_sanitised = {run_data}", title)
223 content = {
224 "action_data": node,
225 "run_status": data,
226 "run_data": run_data
227 }
228 body = self.runtime_data_initialised.boilerplate_responses_initialised.build_response_body(
229 title=title,
230 message=content,
231 resp="success",
232 token=token,
233 error=False
234 )
235 return HCI.success(body, content_type=CONST.CONTENT_TYPE, headers=self.runtime_data_initialised.json_header)
Response post_stop_server(self, Request request)
Definition bonus.py:119
Response get_table(self, Request request)
Definition bonus.py:91
Response get_s3_bucket_names(self, Request request)
Definition bonus.py:68
Response get_welcome(self, Request request)
Definition bonus.py:38
Response trigger_endpoint(self, str id, Request request)
Definition bonus.py:173
None __init__(self, RuntimeData runtime_data, int success=0, int error=84, bool debug=False)
Definition bonus.py:16