A
8672b0de6b
Full working closed-loop eSIM provisioning stack (spec in claude.md / plan/): Flask API, SQLite subscriber store, credential/profile generator, Open5GS and free5gc core adapters, captive portal, operational scripts, systemd units, network configs, and a 44-test suite. Profile generation currently returns a mock JSON profile; real SGP.22 generation via pySim is the planned Phase-2 upgrade. Fixes two bugs found while getting the suite green: - generate_imsi hardcoded a 10-digit MSIN, producing 16-digit IMSIs for a 3-digit MNC; MSIN length is now 15 - len(mcc) - len(mnc). - check_rate_limit compared timestamps as strings across mismatched formats (SQLite CURRENT_TIMESTAMP vs Python isoformat); both sides now normalized via SQLite datetime() so the window check is chronologically correct. Add .gitignore for venv, caches, runtime config.yaml, and databases. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
23 lines
564 B
Python
23 lines
564 B
Python
#!/usr/bin/env python3
|
|
"""Initialize the SQLite subscriber database."""
|
|
import os
|
|
import sys
|
|
|
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
|
|
from server.database import init_db
|
|
from server.utils import load_config
|
|
|
|
|
|
def main():
|
|
config_path = os.environ.get("CONFIG_PATH", "config.yaml")
|
|
cfg = load_config(config_path)
|
|
db_path = cfg["database"]["path"]
|
|
os.makedirs(os.path.dirname(db_path), exist_ok=True)
|
|
init_db(db_path)
|
|
print(f"Database initialized at {db_path}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|