| """
|
| SQLAlchemy models for VPN server
|
| """
|
| from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, Float, Enum, Boolean
|
| from sqlalchemy.orm import relationship
|
| from datetime import datetime
|
| import enum
|
|
|
| from core.database import Base
|
|
|
| class UserRole(str, enum.Enum):
|
| ADMIN = "admin"
|
| USER = "user"
|
|
|
| class UserStatus(str, enum.Enum):
|
| ACTIVE = "active"
|
| INACTIVE = "inactive"
|
| SUSPENDED = "suspended"
|
|
|
| class User(Base):
|
| __tablename__ = "users"
|
|
|
| id = Column(Integer, primary_key=True, index=True)
|
| username = Column(String, unique=True, index=True)
|
| email = Column(String, unique=True, index=True)
|
| password = Column(String)
|
| role = Column(String, default=UserRole.USER)
|
| status = Column(String, default=UserStatus.ACTIVE)
|
| vpn_protocol = Column(String, default="outline")
|
| created_at = Column(DateTime, default=datetime.utcnow)
|
| last_login = Column(DateTime, nullable=True)
|
|
|
|
|
| sessions = relationship("VPNSession", back_populates="user")
|
| config = relationship("UserVPNConfig", back_populates="user", uselist=False)
|
| bandwidth_usages = relationship("BandwidthUsage", back_populates="user")
|
|
|
| class VPNSession(Base):
|
| __tablename__ = "vpn_sessions"
|
|
|
| id = Column(Integer, primary_key=True, index=True)
|
| user_id = Column(Integer, ForeignKey("users.id"))
|
| protocol = Column(String)
|
| client_ip = Column(String)
|
| server_ip = Column(String)
|
| start_time = Column(DateTime, default=datetime.utcnow)
|
| end_time = Column(DateTime, nullable=True)
|
| bytes_sent = Column(Integer, default=0)
|
| bytes_received = Column(Integer, default=0)
|
| status = Column(String, default="active")
|
|
|
|
|
| user = relationship("User", back_populates="sessions")
|
|
|
| class UserVPNConfig(Base):
|
| __tablename__ = "user_vpn_configs"
|
|
|
| id = Column(Integer, primary_key=True, index=True)
|
| user_id = Column(Integer, ForeignKey("users.id"), unique=True)
|
| protocol = Column(String)
|
| config_data = Column(String)
|
| created_at = Column(DateTime, default=datetime.utcnow)
|
| last_updated = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
|
|
|
|
|
| user = relationship("User", back_populates="config")
|
|
|
| class BandwidthUsage(Base):
|
| __tablename__ = "bandwidth_usage"
|
|
|
| id = Column(Integer, primary_key=True, index=True)
|
| user_id = Column(Integer, ForeignKey("users.id"))
|
| timestamp = Column(DateTime, default=datetime.utcnow)
|
| bytes_up = Column(Integer, default=0)
|
| bytes_down = Column(Integer, default=0)
|
| protocol = Column(String)
|
|
|
|
|
| user = relationship("User", back_populates="bandwidth_usages")
|
|
|
| class ServerConfig(Base):
|
| __tablename__ = "server_config"
|
|
|
| id = Column(Integer, primary_key=True, index=True)
|
| server_name = Column(String, default="VPN Server")
|
| max_clients = Column(Integer, default=100)
|
| bandwidth_limit = Column(Integer, nullable=True)
|
| maintenance_mode = Column(Boolean, default=False)
|
| created_at = Column(DateTime, default=datetime.utcnow)
|
| updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
|
|
|
| class AuditLog(Base):
|
| __tablename__ = "audit_logs"
|
|
|
| id = Column(Integer, primary_key=True, index=True)
|
| timestamp = Column(DateTime, default=datetime.utcnow)
|
| user_id = Column(Integer, ForeignKey("users.id"), nullable=True)
|
| action = Column(String)
|
| details = Column(String)
|
| ip_address = Column(String, nullable=True)
|
|
|
|
|
| user = relationship("User")
|
|
|