| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- #!/usr/bin/env python3
- """
- Crea el primer usuario superadmin en la base de datos interna.
- Uso (desde internal/):
- python scripts/seed_admin.py
- Requiere que las variables de entorno estén configuradas (lee .env automáticamente).
- La base de datos PostgreSQL debe estar corriendo.
- """
- import sys
- import os
- # Permite ejecutar el script desde internal/ o desde la raíz
- sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))
- # Lee el .env manualmente para conexión local (sin depender de python-dotenv)
- def _read_env(path: str) -> dict[str, str]:
- result: dict[str, str] = {}
- if os.path.exists(path):
- with open(path) as f:
- for line in f:
- line = line.strip()
- if line and not line.startswith("#") and "=" in line:
- key, _, val = line.partition("=")
- result[key.strip()] = val.strip()
- return result
- # Lee el .env raíz del proyecto
- _here = os.path.dirname(os.path.abspath(__file__))
- env = _read_env(os.path.join(_here, "..", "..", ".env"))
- pg_user = env.get("INTERNAL_DB_USER", "internal-database-user")
- pg_pass = env.get("INTERNAL_DB_PASSWORD", "")
- pg_db = env.get("INTERNAL_DB_NAME", "internal-database")
- pg_port = env.get("INTERNAL_DB_PORT", "5555")
- jwt_key = env.get("JWT_SECRET_KEY", "seed-only")
- plat_user = env.get("PLATFORM_DB_USER", "x")
- plat_pass = env.get("PLATFORM_DB_PASSWORD", "x")
- plat_db = env.get("PLATFORM_DB_NAME", "x")
- plat_port = env.get("PLATFORM_DB_PORT", "55557")
- os.environ.setdefault("INTERNAL_DB_URL", f"postgresql://{pg_user}:{pg_pass}@localhost:{pg_port}/{pg_db}")
- os.environ.setdefault("PLATFORM_DB_URL", f"postgresql://{plat_user}:{plat_pass}@localhost:{plat_port}/{plat_db}")
- os.environ.setdefault("JWT_SECRET_KEY", jwt_key)
- from src.backend.core.database import internal_engine, InternalSession # noqa: E402
- from src.backend.core.security import hash_password # noqa: E402
- from src.backend.db_models.internal import InternalBase, LogAdmin, RolAdmin, UsuarioAdmin # noqa: E402
- def seed():
- print("\n=== Seed: Administrador Interno ===\n")
- # Crea las tablas si no existen
- InternalBase.metadata.create_all(bind=internal_engine)
- print("✓ Esquema verificado")
- db = InternalSession()
- try:
- # Roles
- roles_existentes = db.query(RolAdmin).count()
- if roles_existentes == 0:
- for nombre in ("superadmin", "admin", "moderador", "viewer"):
- db.add(RolAdmin(nombre=nombre))
- db.commit()
- print("✓ Roles creados: superadmin, admin, moderador, viewer")
- else:
- print(f" Roles ya existentes ({roles_existentes})")
- # Superadmin
- username = input("\nUsername [admin]: ").strip() or "admin"
- existing = db.query(UsuarioAdmin).filter(UsuarioAdmin.username == username).first()
- if existing:
- print(f"\n⚠ El usuario '{username}' ya existe. Abortando.")
- return
- email = input("Email: ").strip()
- while not email:
- email = input("Email (requerido): ").strip()
- password = input("Contraseña: ").strip()
- while len(password) < 8:
- password = input("Contraseña (mínimo 8 caracteres): ").strip()
- nombre = input("Nombre completo [Administrador]: ").strip() or "Administrador"
- rol = db.query(RolAdmin).filter(RolAdmin.nombre == "superadmin").first()
- user = UsuarioAdmin(
- username=username,
- email=email,
- password_hash=hash_password(password),
- nombre=nombre,
- id_rol=rol.id_rol,
- )
- db.add(user)
- db.commit()
- db.refresh(user)
- db.add(LogAdmin(
- id_usuario=user.id_usuario,
- accion="SEED",
- descripcion="Usuario superadmin creado via seed script",
- ))
- db.commit()
- print(f"\n✓ Usuario '{username}' ({email}) creado con rol superadmin")
- print(" Ya puedes hacer login en POST /auth/login\n")
- except Exception as e:
- db.rollback()
- print(f"\n✗ Error: {e}")
- raise
- finally:
- db.close()
- if __name__ == "__main__":
- seed()
|