zoukankan      html  css  js  c++  java
  • 堡垒机表结构设计

    一、堡垒机表结构

      

     二、创建表

    # -*- 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
    建表
  • 相关阅读:
    QuantLib 金融计算——案例之固息债的关键利率久期(KRD)
    Elasticsearch 最佳运维实践
    Ansible常用的Ansible Module
    中国七夕节( Chinese Valentine's Day)IT的浪漫情结
    Leetcode之C++刷题生死战
    无需Root可自动定时发送微信和短信的黑科技APP,支持跳过开屏启动广告
    tmp
    【整理中】可靠性基础_抽样检测
    【汇总】命名及标识
    Treelist父节点上下移
  • 原文地址:https://www.cnblogs.com/bigberg/p/8400988.html
Copyright © 2011-2022 走看看