From f101d918217df4063ef0fe52273083125f15489e Mon Sep 17 00:00:00 2001 From: JiriUhlir <149317995+JiriUhlir@users.noreply.github.com> Date: Mon, 8 Jun 2026 08:15:27 +0200 Subject: [PATCH] =?UTF-8?q?Upraveno.=20Port=C3=A1l=20u=C5=BE=20ne=C4=8Dte?= =?UTF-8?q?=20ani=20neinterpretuje=20READY/NOT=20READY=20z=20textu=20v?= =?UTF-8?q?=C3=BDstupu=20a=20nep=C5=99id=C3=A1v=C3=A1=20=C5=BE=C3=A1dnou?= =?UTF-8?q?=20logiku=20pro=20disk,=20backup,=20Gitea=20ani=20Registry.=20Z?= =?UTF-8?q?m=C4=9Bny:=20migration=5Freadiness.py=20(line=20140)=20te=C4=8F?= =?UTF-8?q?=20ur=C4=8Duje=20READY=20pouze=20jako=20returncode=20=3D=3D=200?= =?UTF-8?q?;=20chyb=C4=9Bj=C3=ADc=C3=AD=20nebo=20nenulov=C3=BD=20return=20?= =?UTF-8?q?code=20je=20NOT=20READY.=20Preflight=20UI=20v=20routes/migratio?= =?UTF-8?q?n=5Freadiness.py=20(line=2085)=20zobrazuje=20Return=20code,=20s?= =?UTF-8?q?ummary=20OK/WARN/FAIL=20a=20odd=C4=9Blen=C3=A9=20raw=20stdout?= =?UTF-8?q?=20/=20stderr.=20Odstran=C4=9Bn=C3=A1=20vlastn=C3=AD=20logika,?= =?UTF-8?q?=20kter=C3=A1=20hledala=20READY/NOT=20READY=20ve=20v=C3=BDstupu?= =?UTF-8?q?=20skriptu.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/db/migration_readiness.py | 56 +++++++++++++------------------ app/routes/migration_readiness.py | 22 ++++++++---- 2 files changed, 39 insertions(+), 39 deletions(-) diff --git a/app/db/migration_readiness.py b/app/db/migration_readiness.py index f80891e..9bd0736 100644 --- a/app/db/migration_readiness.py +++ b/app/db/migration_readiness.py @@ -137,32 +137,6 @@ def _first_int(data: dict[str, Any], keys: tuple[str, ...]) -> int | None: return None -def _readiness_from_script_output(result_data: dict[str, Any], combined_text: str) -> bool: - ready_value = result_data.get("ready") - if isinstance(ready_value, bool): - return ready_value - - readiness_value = str( - result_data.get("readiness") - or result_data.get("migration_readiness") - or result_data.get("migrationReadiness") - or "" - ).strip().upper() - - if readiness_value == "READY": - return True - if readiness_value == "NOT READY": - return False - - upper_text = combined_text.upper() - if re.search(r"(? dict[str, Any]: if not job: return { @@ -170,18 +144,34 @@ def summarize_readiness(job: dict[str, Any] | None) -> dict[str, Any]: "ok_count": 0, "warn_count": 0, "fail_count": 0, - "raw_output": "", + "return_code": None, + "stdout": "", + "stderr": "", "job": None, } - raw_output = get_job_log_output(int(job["id"])) result_data = _result_data(job) + return_code = _result_value(job, ("returncode", "return_code", "exit_code", "exitCode")) + stdout = _result_value(job, ("stdout", "out")) + stderr = _result_value(job, ("stderr", "err")) + + if stdout is None: + stdout = get_job_log_output(int(job["id"]), stream="stdout", include_stream=False) + if stderr is None: + stderr = get_job_log_output(int(job["id"]), stream="stderr", include_stream=False) + + error_text = job.get("error_text") or "" + if error_text: + stderr = f"{stderr}\n{error_text}" if stderr else error_text + + stdout = _redact_sensitive_text(str(stdout or "")) + stderr = _redact_sensitive_text(str(stderr or "")) combined_text = "\n".join( value for value in ( - raw_output, + stdout, + stderr, job.get("result_json") or "", - job.get("error_text") or "", ) if value ) @@ -198,11 +188,13 @@ def summarize_readiness(job: dict[str, Any] | None) -> dict[str, Any]: fail_count = _count_token(combined_text, "FAIL") return { - "ready": _readiness_from_script_output(result_data, combined_text), + "ready": return_code == 0, "ok_count": ok_count, "warn_count": warn_count, "fail_count": fail_count, - "raw_output": raw_output, + "return_code": return_code, + "stdout": stdout, + "stderr": stderr, "job": job, } diff --git a/app/routes/migration_readiness.py b/app/routes/migration_readiness.py index f6799ce..03ee493 100644 --- a/app/routes/migration_readiness.py +++ b/app/routes/migration_readiness.py @@ -85,25 +85,27 @@ def migration_readiness_page(request: Request, user=Depends(require_user)): job_rows = 'Zatím není uložený žádný výsledek preflight kontroly.' if job: job_id = html.escape(str(job.get("id", ""))) + return_code = summary.get("return_code") + return_code_label = "" if return_code is None else html.escape(str(return_code)) job_rows = f""" Úloha#{job_id} Stav úlohy{render_job_status(job.get("status"))} + Return code{return_code_label} Vytvořeno{html.escape(job.get("created_at", "") or "")} Spuštěno{html.escape(job.get("started_at", "") or "")} Dokončeno{html.escape(job.get("finished_at", "") or "")} Worker{html.escape(job.get("worker_id", "") or "")} """ - raw_output = html.escape(summary.get("raw_output") or "") - if not raw_output: - raw_output = "Zatím není uložený žádný log výstup." + stdout = html.escape(summary.get("stdout") or "Zatím není uložený žádný stdout log.") + stderr = html.escape(summary.get("stderr") or "Zatím není uložený žádný stderr log.") return page( "Migration Readiness", f"""

Migration Readiness

-

Poslední výsledek maintenance skriptu {html.escape(PREFLIGHT_SCRIPT)} uložený v databázi. Stav vychází pouze z výstupu skriptu.

+

Poslední výsledek maintenance skriptu {html.escape(PREFLIGHT_SCRIPT)} uložený v databázi. Stav READY / NOT READY vychází pouze z return code jobu.

@@ -152,9 +154,15 @@ def migration_readiness_page(request: Request, user=Depends(require_user)):
-
-

Raw preflight log výstup

-
{raw_output}
+
+
+

Raw preflight stdout

+
{stdout}
+
+
+

Raw preflight stderr

+
{stderr}
+
{render_script_result("Poslední výsledek Bootstrap v2", BOOTSTRAP_SCRIPT, bootstrap_summary)}