Spaces:
Running
Running
durability probe instead of writability check
Browse files- app/ledger.py +32 -3
- app/main.py +7 -3
app/ledger.py
CHANGED
|
@@ -24,16 +24,45 @@ def _root():
|
|
| 24 |
os.makedirs(want, exist_ok=True)
|
| 25 |
t = os.path.join(want, ".w")
|
| 26 |
open(t, "w").close(); os.remove(t)
|
| 27 |
-
return want
|
| 28 |
except Exception:
|
| 29 |
pass
|
| 30 |
-
return os.path.join(os.path.dirname(os.path.abspath(__file__)), "_data")
|
| 31 |
|
| 32 |
|
| 33 |
-
ROOT
|
| 34 |
LOCK = threading.Lock()
|
| 35 |
|
| 36 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 37 |
def _p(*a):
|
| 38 |
p = os.path.join(ROOT, *a)
|
| 39 |
os.makedirs(os.path.dirname(p), exist_ok=True)
|
|
|
|
| 24 |
os.makedirs(want, exist_ok=True)
|
| 25 |
t = os.path.join(want, ".w")
|
| 26 |
open(t, "w").close(); os.remove(t)
|
| 27 |
+
return want
|
| 28 |
except Exception:
|
| 29 |
pass
|
| 30 |
+
return os.path.join(os.path.dirname(os.path.abspath(__file__)), "_data")
|
| 31 |
|
| 32 |
|
| 33 |
+
ROOT = _root()
|
| 34 |
LOCK = threading.Lock()
|
| 35 |
|
| 36 |
|
| 37 |
+
def boot_check():
|
| 38 |
+
"""μμ₯μ΄ μ¬μμμ 견λλμ§ **μ€μΈ‘**νλ€.
|
| 39 |
+
|
| 40 |
+
π΄ 'μ°κΈ°κ° λλκ°'λ‘ νμ νλ©΄ μ λλ€. μμ μ€ν 리μ§κ° μμ΄λ /data λ
|
| 41 |
+
λ§λ€μ΄μ§κ³ μ¨μ§λ€ β μ¬μμν λ μ¬λΌμ§ λΏμ΄λ€. κ·Έλμ μ°κΈ° κ²μ¬λ
|
| 42 |
+
νμ ν΅κ³Όνλ κ°μ§ μ νΈλ€. μ€μ λ‘ νμΈνλ €λ©΄ μ΄μ λΆν
μ νμ μ΄
|
| 43 |
+
λ¨μ μλμ§λ₯Ό λ΄μΌ νλ€.
|
| 44 |
+
|
| 45 |
+
λ°ν: (νμ , λΆν
νμ)
|
| 46 |
+
"νμΈλ¨" μ΄μ λΆν
κΈ°λ‘μ΄ μ΄μλ¨μλ€ = μμ
|
| 47 |
+
"λ―ΈνμΈ" 첫 λΆν
μ΄λΌ μμ§ μ μ μλ€
|
| 48 |
+
"νλ°λ¨" κΈ°λ‘μ λ¨κ²Όλλ° μ¬λΌμ‘λ€ = μ¬μμλ§λ€ μμ₯μ΄ λ μκ°λ€
|
| 49 |
+
"""
|
| 50 |
+
f = os.path.join(ROOT, "_boot.json")
|
| 51 |
+
prev = _read(f, None)
|
| 52 |
+
n = (prev or {}).get("n", 0) + 1
|
| 53 |
+
if prev is None:
|
| 54 |
+
# 컨ν
μ΄λλ μμλλλ° νμ μ΄ μλ€. 첫 λΆν
μΈμ§ λ μκ° κ±΄μ§λ
|
| 55 |
+
# μ΄ μμ μ ꡬλΆλμ§ μλλ€. νμ μ λ€μ λΆν
μΌλ‘ 미룬λ€.
|
| 56 |
+
verdict = "λ―ΈνμΈ"
|
| 57 |
+
else:
|
| 58 |
+
verdict = "νμΈλ¨"
|
| 59 |
+
try:
|
| 60 |
+
_write(f, {"n": n, "at": now().isoformat(), "root": ROOT})
|
| 61 |
+
except Exception:
|
| 62 |
+
pass
|
| 63 |
+
return verdict, n
|
| 64 |
+
|
| 65 |
+
|
| 66 |
def _p(*a):
|
| 67 |
p = os.path.join(ROOT, *a)
|
| 68 |
os.makedirs(os.path.dirname(p), exist_ok=True)
|
app/main.py
CHANGED
|
@@ -336,6 +336,9 @@ def _anchor_loop():
|
|
| 336 |
time.sleep(6 * 3600)
|
| 337 |
|
| 338 |
|
|
|
|
|
|
|
|
|
|
| 339 |
@app.on_event("startup")
|
| 340 |
def _startup():
|
| 341 |
if os.environ.get("FINCHAL_NO_ANCHOR"):
|
|
@@ -347,6 +350,7 @@ def _startup():
|
|
| 347 |
@app.get("/health")
|
| 348 |
def health():
|
| 349 |
return {"ok": True, "season": S1["name"], "assets": list(ASSETS),
|
| 350 |
-
"ledger": L.ROOT, "
|
| 351 |
-
"warn": None if
|
| 352 |
-
"
|
|
|
|
|
|
| 336 |
time.sleep(6 * 3600)
|
| 337 |
|
| 338 |
|
| 339 |
+
_DUR = L.boot_check()
|
| 340 |
+
|
| 341 |
+
|
| 342 |
@app.on_event("startup")
|
| 343 |
def _startup():
|
| 344 |
if os.environ.get("FINCHAL_NO_ANCHOR"):
|
|
|
|
| 350 |
@app.get("/health")
|
| 351 |
def health():
|
| 352 |
return {"ok": True, "season": S1["name"], "assets": list(ASSETS),
|
| 353 |
+
"ledger": L.ROOT, "durability": _DUR[0], "boots": _DUR[1],
|
| 354 |
+
"warn": None if _DUR[0] == "νμΈλ¨" else
|
| 355 |
+
"μμ₯μ΄ μ¬μμμ 견λλμ§ μμ§ νμΈλμ§ μμμ΅λλ€. "
|
| 356 |
+
"μμ μ€ν λ¦¬μ§ μμ΄ μμ¦μ μ΄λ©΄ κΈ°λ‘μ΄ μ¬λΌμ§ μ μμ΅λλ€."}
|