from datetime import datetime from sqlalchemy import DateTime, String, Text, func from sqlalchemy.dialects.postgresql import JSONB from sqlalchemy.orm import Mapped, mapped_column, relationship from app.database import Base class Host(Base): __tablename__ = "hosts" id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True) agent_instance_id: Mapped[str | None] = mapped_column(String(128), unique=True, index=True) hostname: Mapped[str] = mapped_column(String(255), index=True) display_name: Mapped[str | None] = mapped_column(String(255)) os_family: Mapped[str] = mapped_column(String(32)) os_version: Mapped[str | None] = mapped_column(String(128)) product: Mapped[str] = mapped_column(String(64), index=True) product_version: Mapped[str | None] = mapped_column(String(64)) ipv4: Mapped[str | None] = mapped_column(String(45)) ipv6: Mapped[str | None] = mapped_column(String(45)) tags: Mapped[list | None] = mapped_column(JSONB, default=list) inventory: Mapped[dict | None] = mapped_column(JSONB) inventory_updated_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True)) use_sac_mode: Mapped[str | None] = mapped_column(String(32)) ssh_admin_ok: Mapped[bool | None] = mapped_column(nullable=True) ssh_admin_checked_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True)) # Optional override for SSH/WinRM (home PCs, unique local admin). Empty → global Settings. mgmt_user: Mapped[str | None] = mapped_column(String(256)) mgmt_password: Mapped[str | None] = mapped_column(Text) pending_agent_update: Mapped[bool] = mapped_column(default=False, server_default="false") pending_update_requested_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True)) pending_update_target_version: Mapped[str | None] = mapped_column(String(64)) agent_config: Mapped[dict | None] = mapped_column(JSONB) agent_config_revision: Mapped[int] = mapped_column(default=0, server_default="0") agent_update_state: Mapped[str | None] = mapped_column(String(32)) agent_update_last_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True)) agent_update_last_error: Mapped[str | None] = mapped_column(Text) remote_action: Mapped[dict | None] = mapped_column(JSONB) last_seen_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) events: Mapped[list["Event"]] = relationship(back_populates="host") agent_commands: Mapped[list["AgentCommand"]] = relationship(back_populates="host")