diff --git a/site/app.py b/site/app.py index 1c1a8b7..ff7aa8a 100644 --- a/site/app.py +++ b/site/app.py @@ -18,7 +18,7 @@ from routes.api import bp as api_bp from routes.api_test import bp as api_test_bp # Версия — меняется при КАЖДОМ изменении кода. Показывается в топбаре UI. -VERSION = "1.1.20" +VERSION = "1.1.21" app = Flask(__name__, template_folder="templates", static_folder="static") app.config["NUBES_API_ENDPOINT"] = os.getenv("NUBES_API_ENDPOINT", "https://lk-api-gateway-test.ngcloud.ru/api/v1/svc") diff --git a/site/db/pool.py b/site/db/pool.py index a0e7c36..947543f 100644 --- a/site/db/pool.py +++ b/site/db/pool.py @@ -36,10 +36,10 @@ def _ensure_schema(): global _initialized if _initialized: return - _initialized = True try: from db.init_db import init_db init_db() + _initialized = True except Exception: pass diff --git a/site/routes/api_test.py b/site/routes/api_test.py index 59cadc0..34a7ae0 100644 --- a/site/routes/api_test.py +++ b/site/routes/api_test.py @@ -231,7 +231,7 @@ def api_test(): # фоном ждать завершения user_email = get_token_info().get("email", "") app_version = current_app.config.get("VERSION", "") - threading.Thread(target=_finish_op, args=(client, op_uid, instance_uid, svc_id, display_name, op_name, svc_op_id, True, get_client_id(), get_stand(), params, user_email, app_version), daemon=True).start() + threading.Thread(target=_finish_op, args=(client, op_uid, instance_uid, svc_id, display_name, op_name, svc_op_id, True, get_client_id(), get_stand(), False, params, user_email, app_version), daemon=True).start() return jsonify({"status": "RUNNING", "opUid": op_uid, "instanceUid": instance_uid, "displayName": display_name}) else: @@ -436,6 +436,14 @@ def api_history(): put_conn(conn) return jsonify(result) except Exception as e: + try: + cur.close() + except Exception: + pass + try: + put_conn(conn) + except Exception: + pass return jsonify({"error": str(e)}), 500 diff --git a/site/routes/main.py b/site/routes/main.py index 83a1e28..c43a141 100644 --- a/site/routes/main.py +++ b/site/routes/main.py @@ -91,7 +91,7 @@ def index(): user_token = request.form.get("token", "") active_token = user_token or env_token resp = make_response() - resp.set_cookie("token", user_token, max_age=60*60*24*365, httponly=True, samesite="Strict") # 1 год + resp.set_cookie("token", user_token, max_age=60*60*24*365, httponly=True, samesite="Strict", secure=True) # 1 год resp.headers["Location"] = "/" # редирект на GET (убирает POST из истории) resp.status_code = 302 return resp diff --git a/site/static/app.js b/site/static/app.js index dc35c37..f28ff1e 100644 --- a/site/static/app.js +++ b/site/static/app.js @@ -47,7 +47,7 @@ async function selectService(svcId){ const d=await r.json(); svcInstances=d.instances||[]; currentSvcName=d.svc||''; - currentSvcShort=d.svcShort||''; + let currentSvcShort=d.svcShort||''; // Обновить текст кнопки создания const btnSpan=document.querySelector('#create-btn-area span'); if(btnSpan) btnSpan.textContent='+ Создать новый инстанс '+(currentSvcName||'сервиса'); @@ -57,9 +57,9 @@ async function selectService(svcId){ const status=i.status||i.explainedStatus||'?'; const sc=status==='running'?'badge-success':''; html+=`
- ${i.displayName} - ${i.svc||''} - ${status} + ${_esc(i.displayName)} + ${_esc(i.svc||'')} + ${_esc(status)}
`; html+=`
`; }); @@ -353,7 +353,7 @@ function showStages(stages){ stages.forEach(s=>{ const done=!!s.dtFinish; const icon=done?(s.isSuccessful?'✅':'❌'):'⏳'; - html+=`
${icon} ${s.stage} — ${(s.duration||0).toFixed(1)}s
`; + html+=`
${icon} ${_esc(s.stage)} — ${(s.duration||0).toFixed(1)}s
`; }); const boxes=document.querySelectorAll('.stages-box'); if(boxes.length) boxes[boxes.length-1].innerHTML=html; @@ -373,9 +373,9 @@ async function refreshInstances(){ const status=i.status||i.explainedStatus||'?'; const sc=status==='running'?'badge-success':''; html+=`
- ${i.displayName} - ${i.svc||''} - ${status} + ${_esc(i.displayName)} + ${_esc(i.svc||'')} + ${_esc(status)}
`; html+=`
`; }); @@ -404,9 +404,9 @@ async function loadHistory(){ const cls=r.status==='OK'?'badge-success':''; html+=` ${time} - ${r.op_name||'?'} - ${r.display_name||r.instance_uid||'?'} - ${r.status||'?'} + ${_esc(r.op_name||'?')} + ${_esc(r.display_name||r.instance_uid||'?')} + ${_esc(r.status||'?')} ${r.duration_sec!=null?r.duration_sec.toFixed(1)+'s':'-'} `; });