堡垒机表结构设计

一、堡垒机表结构

  

 二、创建表

# -*- coding: UTF-8 -*-


from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, UniqueConstraint, Table, ForeignKey, DateTime
from sqlalchemy.orm import relationship
from sqlalchemy_utils import ChoiceType


Base = declarative_base()

# 堡垒机用户和远程主机的关联
user_m2m_bindhost = Table("user_m2m_bindhost", Base.metadata,
                          Column("id", Integer, primary_key=True),
                          Column('user_profile_id', Integer, ForeignKey("user_profile.id")),
                          Column('bind_host_id', Integer, ForeignKey("bind_host.id")))

# 远程主机和主机组关联
bindhost_m2m_hostgroup = Table("bindhost_m2m_hostgroup", Base.metadata,
                               Column("id", Integer, primary_key=True),
                               Column('host_groups_id', Integer, ForeignKey("host_groups.id")),
                               Column('bind_host_id', Integer, ForeignKey("bind_host.id")))

# 堡垒机用户和主机组关联
user_m2m_hostgroup = Table("user_m2m_hostgroup", Base.metadata,
                           Column("id", Integer, primary_key=True),
                           Column('user_profile_id', Integer, ForeignKey("user_profile.id")),
                           Column('host_group_id', Integer, ForeignKey("host_groups.id")))


class Host(Base):
    # 主机表
    __tablename__ = 'host'
    id = Column(Integer, primary_key=True)
    hostname = Column(String(64), unique=True)
    ip = Column(String(64), unique=True)
    port = Column(Integer, default=22)

    def __repr__(self):
        return self.hostname


class HostGroup(Base):
    # 主机组表
    __tablename__ = 'host_groups'
    id = Column(Integer, primary_key=True)
    name = Column(String(64), unique=True)
    function = Column(String(64))

    bind_hosts = relationship('BindHost', secondary='bindhost_m2m_hostgroup',
                              backref='host_group')

    def __repr__(self):
        return self.name


class RemoteUser(Base):
    # 远程用户表
    __tablename__ = 'remote_user'
    # 联合唯一
    __table_args__ = (UniqueConstraint("auth_type", "username", "password", name="_user_password_uc"), )
    id = Column(Integer, primary_key=True)
    username = Column(String(32))
    password = Column(String(128))

    # 第1个值存数据库,第2个值是sqlalchemy显示的
    AuthTypes = [
        ("ssh-password", "SSH/Password"),
        ("ssh-key", "SSH/KEY")
    ]  # 设置枚举值
    auth_type = Column(ChoiceType(AuthTypes))

    def __repr__(self):
        return self.username


class BindHost(Base):
    '''
    绑定主机组、主机和远程用户
    '''
    __tablename__ = 'bind_host'
    __table_args__ = (UniqueConstraint("host_id", "remoteuser_id", name="_host_remoteuser"),)
    id = Column(Integer, primary_key=True)
    host_id = Column(Integer, ForeignKey('host.id'))
    remoteuser_id = Column(Integer, ForeignKey('remote_user.id'))
    host = relationship('Host', backref='bind_hosts')
    remoteuser = relationship('RemoteUser', backref='bind_hosts')

    def __repr__(self):
        return "%s %s" % (self.host.ip, self.remoteuser.username)


class UserProfile(Base):
    # 堡垒机用户表
    __tablename__ = 'user_profile'
    id = Column(Integer, primary_key=True)
    username = Column(String(32), unique=True)
    password = Column(String(128))

    bind_hosts = relationship("BindHost", secondary='user_m2m_bindhost', backref='user_profile')
    host_groups = relationship("HostGroup", secondary='user_m2m_hostgroup', backref='user_profile')

    def __repr__(self):
        return self.username


class AuditLog(Base):
    # 日志表
    __tablename__ = 'audit_log'
    id = Column(Integer, primary_key=True)
    user_id = Column(Integer, ForeignKey('user_profile.id'))
    bind_host_id = Column(Integer, ForeignKey('bind_host.id'))
    action_choices = [
        (0, 'CMD'),
        (1, 'Login'),
        (2, 'Logout'),
        (3, 'GetFile'),
        (4, 'SendFile'),
        (5, 'Exception'),
    ]
    action_choices2 = [
        (u'cmd', u'CMD'),
        (u'login', u'Login'),
        (u'logout', u'Logout'),
        # (3,'GetFile'),
        # (4,'SendFile'),
        # (5,'Exception'),
    ]
    action_type = Column(ChoiceType(action_choices2))
    # action_type = Column(String(64))
    cmd = Column(String(255))
    date = Column(DateTime)

    user_profile = relationship("UserProfile", backref='audit_logs')
    bind_host = relationship("BindHost", backref='audit_logs')

    def __repr__(self):
        return "%s %s %s" % (self.date, self.action_type, self.cmd)

if __name__ == '__main__':
    pass
建表

 

posted @ 2018-02-05 11:51  Bigberg  阅读(405)  评论(0编辑  收藏  举报