elemes/scripts/bootstrap_teacher.py

69 lines
2.0 KiB
Python
Raw Normal View History

#!/usr/bin/env python3
"""
CLI bootstrap akun guru dipanggil dari `./elemes.sh teacher`.
Nama guru diberikan sebagai argv[1] (non-secret). Token guru dibaca dari
stdin (baris pertama, spasi tepi di-strip) sehingga tidak pernah muncul
di process list maupun shell history. Jalur yang sama dipakai oleh
first-run otomatis yang mengirim TEACHER_TOKEN dari .env via stdin.
Exit codes:
0 sukses (created / updated / unchanged)
1 penolakan / kesalahan operasional
2 database tidak tersedia (DATABASE_URL kosong)
"""
import logging
import os
import sys
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
from services.database import SessionLocal # noqa: E402
from services.teacher_bootstrap import TeacherBootstrapError, upsert_teacher # noqa: E402
logging.basicConfig(level=logging.ERROR, stream=sys.stderr)
def main() -> int:
if len(sys.argv) < 2:
print("Error: nama guru tidak diberikan.", file=sys.stderr)
return 1
display_name = sys.argv[1].strip()
raw_token = ""
line = sys.stdin.readline()
if line:
raw_token = line.strip()
if not raw_token:
print("Error: token guru kosong (kirim token lewat stdin).", file=sys.stderr)
return 1
if SessionLocal is None:
print(
"Error: database tidak tersedia (DATABASE_URL kosong). "
"Jalankan ./elemes.sh run terlebih dahulu.",
file=sys.stderr,
)
return 2
db = SessionLocal()
try:
result = upsert_teacher(db, display_name=display_name, raw_token=raw_token)
except TeacherBootstrapError as exc:
print(f"Penolakan: {exc}", file=sys.stderr)
return 1
except Exception: # noqa: BLE001 — CLI boundary; detail hanya ke log
logging.getLogger("bootstrap_teacher").exception("Bootstrap guru gagal")
print("Error: operasi gagal. Lihat log aplikasi untuk detail.", file=sys.stderr)
return 1
finally:
db.close()
print(result["message"])
return 0
if __name__ == "__main__":
sys.exit(main())