import enum from datetime import datetime from sqlalchemy import Column, Integer, String, Float, Boolean, DateTime, Enum, Text from sqlalchemy.orm import DeclarativeBase class Base(DeclarativeBase): pass class DeviceTypeEnum(str, enum.Enum): server = "server" # 服务器 olt = "olt" # OLT switch = "switch" # 交换机 firewall = "firewall" # 防火墙 other = "other" # 其他 class Device(Base): __tablename__ = "devices" id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String(128), nullable=False, comment="设备名称") ip = Column(String(45), nullable=False, index=True, comment="IP 地址") device_type = Column(Enum(DeviceTypeEnum), nullable=False, default=DeviceTypeEnum.other, comment="设备类型") location = Column(String(256), default="", comment="物理位置/地址") project_name = Column(String(256), default="", comment="所属项目") tags = Column(String(512), default="", comment="标签,逗号分隔") # Ping 设置 ping_interval = Column(Integer, default=30, comment="ping 间隔(秒)") alert_threshold = Column(Integer, default=5, comment="连续失败次数判离线") is_enabled = Column(Boolean, default=True, comment="是否启用监控") # 运行状态 current_status = Column(String(16), default="unknown", comment="当前状态: online/offline/unknown") consecutive_failures = Column(Integer, default=0, comment="当前连续失败次数") last_ping_time = Column(DateTime, nullable=True, comment="最后一次 ping 时间") last_online_time = Column(DateTime, nullable=True, comment="最后一次在线时间") last_offline_time = Column(DateTime, nullable=True, comment="最后一次离线时间") created_at = Column(DateTime, default=datetime.now, comment="创建时间") updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间") def __repr__(self): return f""