seed_admin.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. #!/usr/bin/env python3
  2. """
  3. Crea el primer usuario superadmin en la base de datos interna.
  4. Uso (desde internal/):
  5. python scripts/seed_admin.py
  6. Requiere que las variables de entorno estén configuradas (lee .env automáticamente).
  7. La base de datos PostgreSQL debe estar corriendo.
  8. """
  9. import sys
  10. import os
  11. # Permite ejecutar el script desde internal/ o desde la raíz
  12. sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))
  13. # Lee el .env manualmente para conexión local (sin depender de python-dotenv)
  14. def _read_env(path: str) -> dict[str, str]:
  15. result: dict[str, str] = {}
  16. if os.path.exists(path):
  17. with open(path) as f:
  18. for line in f:
  19. line = line.strip()
  20. if line and not line.startswith("#") and "=" in line:
  21. key, _, val = line.partition("=")
  22. result[key.strip()] = val.strip()
  23. return result
  24. # Lee el .env raíz del proyecto
  25. _here = os.path.dirname(os.path.abspath(__file__))
  26. env = _read_env(os.path.join(_here, "..", "..", ".env"))
  27. pg_user = env.get("INTERNAL_DB_USER", "internal-database-user")
  28. pg_pass = env.get("INTERNAL_DB_PASSWORD", "")
  29. pg_db = env.get("INTERNAL_DB_NAME", "internal-database")
  30. pg_port = env.get("INTERNAL_DB_PORT", "5555")
  31. jwt_key = env.get("JWT_SECRET_KEY", "seed-only")
  32. plat_user = env.get("PLATFORM_DB_USER", "x")
  33. plat_pass = env.get("PLATFORM_DB_PASSWORD", "x")
  34. plat_db = env.get("PLATFORM_DB_NAME", "x")
  35. plat_port = env.get("PLATFORM_DB_PORT", "55557")
  36. os.environ.setdefault("INTERNAL_DB_URL", f"postgresql://{pg_user}:{pg_pass}@localhost:{pg_port}/{pg_db}")
  37. os.environ.setdefault("PLATFORM_DB_URL", f"postgresql://{plat_user}:{plat_pass}@localhost:{plat_port}/{plat_db}")
  38. os.environ.setdefault("JWT_SECRET_KEY", jwt_key)
  39. from src.backend.core.database import internal_engine, InternalSession # noqa: E402
  40. from src.backend.core.security import hash_password # noqa: E402
  41. from src.backend.db_models.internal import InternalBase, LogAdmin, RolAdmin, UsuarioAdmin # noqa: E402
  42. def seed():
  43. print("\n=== Seed: Administrador Interno ===\n")
  44. # Crea las tablas si no existen
  45. InternalBase.metadata.create_all(bind=internal_engine)
  46. print("✓ Esquema verificado")
  47. db = InternalSession()
  48. try:
  49. # Roles
  50. roles_existentes = db.query(RolAdmin).count()
  51. if roles_existentes == 0:
  52. for nombre in ("superadmin", "admin", "moderador", "viewer"):
  53. db.add(RolAdmin(nombre=nombre))
  54. db.commit()
  55. print("✓ Roles creados: superadmin, admin, moderador, viewer")
  56. else:
  57. print(f" Roles ya existentes ({roles_existentes})")
  58. # Superadmin
  59. username = input("\nUsername [admin]: ").strip() or "admin"
  60. existing = db.query(UsuarioAdmin).filter(UsuarioAdmin.username == username).first()
  61. if existing:
  62. print(f"\n⚠ El usuario '{username}' ya existe. Abortando.")
  63. return
  64. email = input("Email: ").strip()
  65. while not email:
  66. email = input("Email (requerido): ").strip()
  67. password = input("Contraseña: ").strip()
  68. while len(password) < 8:
  69. password = input("Contraseña (mínimo 8 caracteres): ").strip()
  70. nombre = input("Nombre completo [Administrador]: ").strip() or "Administrador"
  71. rol = db.query(RolAdmin).filter(RolAdmin.nombre == "superadmin").first()
  72. user = UsuarioAdmin(
  73. username=username,
  74. email=email,
  75. password_hash=hash_password(password),
  76. nombre=nombre,
  77. id_rol=rol.id_rol,
  78. )
  79. db.add(user)
  80. db.commit()
  81. db.refresh(user)
  82. db.add(LogAdmin(
  83. id_usuario=user.id_usuario,
  84. accion="SEED",
  85. descripcion="Usuario superadmin creado via seed script",
  86. ))
  87. db.commit()
  88. print(f"\n✓ Usuario '{username}' ({email}) creado con rol superadmin")
  89. print(" Ya puedes hacer login en POST /auth/login\n")
  90. except Exception as e:
  91. db.rollback()
  92. print(f"\n✗ Error: {e}")
  93. raise
  94. finally:
  95. db.close()
  96. if __name__ == "__main__":
  97. seed()