Ejemplo n.º 1
0
 def __init__(self):
     # 默认配置文件路径 [/xxx/]tool/../conf/db.cnf
     tool_conf = ToolConf()
     self.db_conf = tool_conf.get_conf_dict('mysql')
     ToolLog.log_info('db config: {conf}'.format(conf = self.db_conf))
     
     self.mysql_conn = MysqlConn(**self.db_conf)
Ejemplo n.º 2
0
    def backup_binlog(self, from_dir=None, to_dir=None, cmin=86400):
        """备份 BINLOG
        根据时间所给的时间和目录来备份binllog
 
        Args:
            from_dir: binlog生成
            to_dir: binlog备份存放
            cmin: 备份几分钟前的binlog (默认86400分钟/24小时)
        return:
            True/False 备份是否成功
        Raise: None
        """
        # 判断复制给实例的binlog原路径和备份路劲
        if from_dir:
            self.binlog_dir = from_dir
        if to_dir:
            self.backup_binlog_dir = to_dir

        # binlog相关路径记录日志
        ToolLog.log_info('binlog dir: {dir}'.format(dir=self.binlog_dir))
        ToolLog.log_info(
            'binlog backup dir: {dir}'.format(dir=self.backup_binlog_dir))

        is_ok = False
        if self.binlog_dir and self.backup_binlog_dir:
            cmd = ('mkdir -p {to_dir} && '
                   'find {from_dir} -maxdepth 1 -cmin -{cmin} -print | '
                   'sed "1d" | xargs -i cp -r {brace} {to_dir}'.format(
                       to_dir=self.backup_binlog_dir,
                       from_dir=self.binlog_dir,
                       cmin=cmin,
                       brace='{}'))

            is_ok = Toolkit.exec_cmd(cmd)
        return is_ok
Ejemplo n.º 3
0
    def __init__(self):
        # 默认配置文件路径 [/xxx/]tool/../conf/db.cnf
        tool_conf = ToolConf()
        self.db_conf = tool_conf.get_conf_dict('mysql')
        ToolLog.log_info('db config: {conf}'.format(conf=self.db_conf))

        self.mysql_conn = MysqlConn(**self.db_conf)
Ejemplo n.º 4
0
    def insert_obj(self, obj):
        """添加数据到数据库中
        Args:
            obj: 需要插入的对象
        Return: 
            True & False: 代表插入是否成功
        Raise: None
        """
        self.session = self.mysql_conn.get_session()

        tag = False

        try:
            self.session.add(obj)
            self.session.commit()

            # 执行下面两语句会将主键值塞入obj中
            primary_key = obj.__table__.primary_key.columns.items()[0][0]
            eval('obj.{key}'.format(key=primary_key))

            tag = True
        except Exception, e:
            ToolLog.log_error('insert {obj} fail'.format(obj=type(obj)))
            ToolLog.log_error(e)
            ToolLog.log_error(traceback.format_stack())
Ejemplo n.º 5
0
    def send_binlog(self, host, username, password, remote_dir=None):
        """将binlog备份文件传输到远程
        将binlog备份文件传输到远程文件

        Args:
            host: IP
            username: 远程OS用户名
            password: 对应user密码
            remote_dir: 传输到远程的目录
        Return:
            True/False, remote_binlog_dir 
            代表传输是否成功, 和远程备份文件名称
        Raise: None
        """
        # 设置实例变量remote_binlog_dir
        if remote_dir:
            self.remote_binlog_dir = remote_dir

        ToolLog.log_info(
            'remote binlog dir: {dir}'.format(dir=self.remote_binlog_dir))

        is_ok = False
        # 如果有设置远程的binlog备份目录
        if self.remote_binlog_dir and self.backup_binlog_dir:
            is_ok = ToolSSH.ssh_trans(host, username, password,
                                      self.backup_binlog_dir,
                                      self.remote_binlog_dir)
        else:
            ToolLog.log_error(
                'remote binlog dir: {dir}'.format(dir=self.remote_binlog_dir))
            ToolLog.log_error('local backup binlog dir: {dir}'.format(
                dir=self.backup_binlog_dir))

        return is_ok, self.remote_binlog_dir
Ejemplo n.º 6
0
    def get_objs_by_col(self, obj, name, value, cols=[]):
        """通过id获得数据
        Args:
            obj: model 类的字符串
                如: 'CmdbO'
            name: 字段
                如: CmdbO.name
            value: 制度按
            cols: 需要的字段
        Return: 
            objs: 返回一个 obj 列表
        Raise: None
        """
        self.session = self.mysql_conn.get_session()
        objs = None

        if not cols:  # 如果没有指定 列则获取所有的列
            cols = obj.__table__.columns

        try:
            # 查找出说的记录
            objs = (self.session.query(obj).with_entities(*cols).filter(
                name == value).all())
        except NoResultFound as e:
            ToolLog.log_error(
                'can not find obj by primary key {obj}'.format(obj=type(obj)))
            ToolLog.log_error(e)
            ToolLog.log_error(traceback.format_stack())
        finally:
            self.session.close()
            return objs
Ejemplo n.º 7
0
    def insert_obj(self, obj):
        """添加数据到数据库中
        Args:
            obj: 需要插入的对象
        Return: 
            True & False: 代表插入是否成功
        Raise: None
        """
        self.session = self.mysql_conn.get_session()

        tag = False

        try:
            self.session.add(obj)
            self.session.commit()

            # 执行下面两语句会将主键值塞入obj中
            primary_key = obj.__table__.primary_key.columns.items()[0][0]
            eval('obj.{key}'.format(key = primary_key))

            tag = True
        except Exception, e:
            ToolLog.log_error('insert {obj} fail'.format(obj = type(obj)))
            ToolLog.log_error(e)
            ToolLog.log_error(traceback.format_stack())
Ejemplo n.º 8
0
    def get_objs_by_col(self, obj, name, value, cols=[]):
        """通过id获得数据
        Args:
            obj: model 类的字符串
                如: 'CmdbO'
            name: 字段
                如: CmdbO.name
            value: 制度按
            cols: 需要的字段
        Return: 
            objs: 返回一个 obj 列表
        Raise: None
        """
        self.session = self.mysql_conn.get_session()
        objs = None

        if not cols: # 如果没有指定 列则获取所有的列 
            cols = obj.__table__.columns

        try:
            # 查找出说的记录
            objs = (self.session.query(obj)
                          .with_entities(*cols)
                          .filter(name == value)
                          .all())
        except NoResultFound as e:
            ToolLog.log_error('can not find obj by primary key {obj}'.
                              format(obj = type(obj)))
            ToolLog.log_error(e)
            ToolLog.log_error(traceback.format_stack())
        finally:
            self.session.close()
            return objs
Ejemplo n.º 9
0
    def backup_data(self, cmd):
        """执行备份
        将给与的命令在操作系统上运行
        
        Args:
            cmd: 需要执行的命令
        Return:
            True/False 返回命令执行成功还是失败
        """
        # 创建备份目录
        if self.dir:
            mkdir_cmd = 'mkdir -p {dir}'.format(dir=self.dir)
            Toolkit.exec_cmd(mkdir_cmd)

        is_ok = Toolkit.exec_cmd(cmd)

        if is_ok:
            ToolLog.log_info('backup successful!')
        else:
            ToolLog.log_error('backup fail !!!')

        return is_ok
Ejemplo n.º 10
0
    def backup_data(self, cmd):
        """执行备份
        将给与的命令在操作系统上运行
        
        Args:
            cmd: 需要执行的命令
        Return:
            True/False 返回命令执行成功还是失败
        """
        # 创建备份目录
        if self.dir:
            mkdir_cmd = 'mkdir -p {dir}'.format(dir = self.dir)
            Toolkit.exec_cmd(mkdir_cmd)

        is_ok = Toolkit.exec_cmd(cmd)

        if is_ok:
            ToolLog.log_info('backup successful!')
        else:
            ToolLog.log_error('backup fail !!!')

        return is_ok
Ejemplo n.º 11
0
    def backup_binlog(self, from_dir=None, to_dir=None, cmin=86400):
        """备份 BINLOG
        根据时间所给的时间和目录来备份binllog
 
        Args:
            from_dir: binlog生成
            to_dir: binlog备份存放
            cmin: 备份几分钟前的binlog (默认86400分钟/24小时)
        return:
            True/False 备份是否成功
        Raise: None
        """
        # 判断复制给实例的binlog原路径和备份路劲
        if from_dir:
            self.binlog_dir = from_dir
        if to_dir:
            self.backup_binlog_dir = to_dir

        # binlog相关路径记录日志
        ToolLog.log_info('binlog dir: {dir}'.format(dir = self.binlog_dir))
        ToolLog.log_info('binlog backup dir: {dir}'.format(
                                             dir = self.backup_binlog_dir))

        is_ok = False
        if self.binlog_dir and self.backup_binlog_dir:
            cmd = (
                'mkdir -p {to_dir} && '
                'find {from_dir} -maxdepth 1 -cmin -{cmin} -print | '
                'sed "1d" | xargs -i cp -r {brace} {to_dir}'.format(
                    to_dir = self.backup_binlog_dir,
                    from_dir = self.binlog_dir,
                    cmin = cmin,
                    brace = '{}'
                )
            )
             
            is_ok = Toolkit.exec_cmd(cmd)
        return is_ok
Ejemplo n.º 12
0
    def update_objs_by_pri(self, obj, value, update_info={}):
        """通过id跟新数据
        Args:
            obj: model 类
                如: 'CmdbO'
            value: 主键id值
            update_info: 跟新的信息就向 set 后边的信息
                {'name': 'aa', 'age': 12}
        Return: 
            is_ok, obj: 返回一个是否更新成功和obj
        Raise: None
        """
        self.session = self.mysql_conn.get_session()
        cmdb_os = None

        # 构造主键名称, 这边的主键指的是一个增加的主键
        primary_key = obj.__table__.primary_key.columns.items()[0][0]
        obj_primary_key = eval('obj.{key}'.format(key = primary_key))
        
        is_ok = False
        if not update_info: # 如果没有指定 列则获取所有的列 
            err_msg = 'update table: {table} not value'.format(
                                        table = obj.__table__.name)
            ToolLog.log_error(err_msg)
            return is_ok, obj

        try:
            # 查询返回的 对象
            (self.session.query(obj)
                         .filter(obj_primary_key == value)
                         .update(update_info))
            self.session.commit()
            is_ok = True
        except NoResultFound as e:
            ToolLog.log_error('can not find obj by primary key {obj}'.
                              format(obj = type(obj)))
            ToolLog.log_error(e)
            ToolLog.log_error(traceback.format_stack())
        finally:
            self.session.close()
            return is_ok, obj
Ejemplo n.º 13
0
    def update_objs_by_pri(self, obj, value, update_info={}):
        """通过id跟新数据
        Args:
            obj: model 类
                如: 'CmdbO'
            value: 主键id值
            update_info: 跟新的信息就向 set 后边的信息
                {'name': 'aa', 'age': 12}
        Return: 
            is_ok, obj: 返回一个是否更新成功和obj
        Raise: None
        """
        self.session = self.mysql_conn.get_session()
        cmdb_os = None

        # 构造主键名称, 这边的主键指的是一个增加的主键
        primary_key = obj.__table__.primary_key.columns.items()[0][0]
        obj_primary_key = eval('obj.{key}'.format(key=primary_key))

        is_ok = False
        if not update_info:  # 如果没有指定 列则获取所有的列
            err_msg = 'update table: {table} not value'.format(
                table=obj.__table__.name)
            ToolLog.log_error(err_msg)
            return is_ok, obj

        try:
            # 查询返回的 对象
            (self.session.query(obj).filter(
                obj_primary_key == value).update(update_info))
            self.session.commit()
            is_ok = True
        except NoResultFound as e:
            ToolLog.log_error(
                'can not find obj by primary key {obj}'.format(obj=type(obj)))
            ToolLog.log_error(e)
            ToolLog.log_error(traceback.format_stack())
        finally:
            self.session.close()
            return is_ok, obj
Ejemplo n.º 14
0
    def get_obj_by_pri(self, obj, pri_value, cols=[]):
        """通过id获得数据
        Args:
            pri_value: cmdb_os 表的id值
            cols: 需要的字段
            obj: model 类的字符串
                如: 'CmdbO'
            key: model 的主键字符串
                如: 'os_id'
        Return: 
            obj: 返回一个CmdbO 对象
        Raise: None
        """

        # 构造Model类在主键
        # pri_key = '{obj}.{key}'.format(obj=obj, key=key)

        self.session = self.mysql_conn.get_session()
        result = None

        # 构造主键名称, 这边的主键指的是一个增加的主键
        primary_key = obj.__table__.primary_key.columns.items()[0][0]
        obj_primary_key = eval('obj.{key}'.format(key = primary_key))
        
        if not cols: # 如果没有指定 列则获取所有的列 
            cols = obj.__table__.columns

        try:
            # 查询返回的 对象
            result = (self.session.query(obj)
                          .with_entities(*cols)
                          .filter(obj_primary_key == pri_value)
                          .one())
        except Exception as e:
            ToolLog.log_error('can not find obj by primary key {obj}'.
                              format(obj = type(obj)))
            ToolLog.log_error(e)
            ToolLog.log_error(traceback.format_stack())
        finally:
            self.session.close()
            return result 
Ejemplo n.º 15
0
    def get_obj_by_pri(self, obj, pri_value, cols=[]):
        """通过id获得数据
        Args:
            pri_value: cmdb_os 表的id值
            cols: 需要的字段
            obj: model 类的字符串
                如: 'CmdbO'
            key: model 的主键字符串
                如: 'os_id'
        Return: 
            obj: 返回一个CmdbO 对象
        Raise: None
        """

        # 构造Model类在主键
        # pri_key = '{obj}.{key}'.format(obj=obj, key=key)

        self.session = self.mysql_conn.get_session()
        result = None

        # 构造主键名称, 这边的主键指的是一个增加的主键
        primary_key = obj.__table__.primary_key.columns.items()[0][0]
        obj_primary_key = eval('obj.{key}'.format(key=primary_key))

        if not cols:  # 如果没有指定 列则获取所有的列
            cols = obj.__table__.columns

        try:
            # 查询返回的 对象
            result = (self.session.query(obj).with_entities(*cols).filter(
                obj_primary_key == pri_value).one())
        except Exception as e:
            ToolLog.log_error(
                'can not find obj by primary key {obj}'.format(obj=type(obj)))
            ToolLog.log_error(e)
            ToolLog.log_error(traceback.format_stack())
        finally:
            self.session.close()
            return result
Ejemplo n.º 16
0
    def send_binlog(self, host, username, password, remote_dir=None):
        """将binlog备份文件传输到远程
        将binlog备份文件传输到远程文件

        Args:
            host: IP
            username: 远程OS用户名
            password: 对应user密码
            remote_dir: 传输到远程的目录
        Return:
            True/False, remote_binlog_dir 
            代表传输是否成功, 和远程备份文件名称
        Raise: None
        """
        # 设置实例变量remote_binlog_dir
        if remote_dir:
            self.remote_binlog_dir = remote_dir
        
        ToolLog.log_info('remote binlog dir: {dir}'.format(
                                     dir = self.remote_binlog_dir))

        is_ok = False
        # 如果有设置远程的binlog备份目录
        if self.remote_binlog_dir and self.backup_binlog_dir:
            is_ok = ToolSSH.ssh_trans(host,
                                      username,
                                      password,
                                      self.backup_binlog_dir,
                                      self.remote_binlog_dir)
        else:
            ToolLog.log_error('remote binlog dir: {dir}'.format(
                                         dir = self.remote_binlog_dir))
            ToolLog.log_error('local backup binlog dir: {dir}'.format(
                                         dir = self.backup_binlog_dir))


        return is_ok, self.remote_binlog_dir
Ejemplo n.º 17
0
    def exec_sql(self, db_conf={}, sql=None):
        """通过给定的SQL和数据库链接参数执行sql并返回数据
        
        Args:
            db_conf: 数据库连接参数
            sql: 执行的SQL
        Return:
            result 执行sql返回的数据
        Raise: None
        """
        if not sql: # 如果没有sql直接返回 None
            return None 

        result = None
        if not db_conf: # 如果没有传输数据库参数就查询 应用的MySQL
            try:
                self.session = self.mysql_conn.get_session()
                self.session.execute(sql)
            except NoResultFound as e:
                ToolLog.log_error('sql execute in self App MySQL')
                ToolLog.log_error('sql execute error: {sql}'.format(sql=sql))
                ToolLog.log_error(e)
                ToolLog.log_error(traceback.format_stack())
            finally:
                self.session.close()
        else: # 执行指定db_conf的SQL
            try:
                mysql_conn = MysqlConn(**db_conf)
                session = mysql_conn.get_session()
                # 执行SQL
                result = session.execute(sql).fetchall()
            except NoResultFound as e:
                ToolLog.log_error('db config: {conf}'.format(conf=db_conf))
                ToolLog.log_error('sql execute error: {sql}'.format(sql=sql))
                ToolLog.log_error(e)
                ToolLog.log_error(traceback.format_stack())
            finally:
                self.session.close()

        return result
Ejemplo n.º 18
0
    def exec_sql(self, db_conf={}, sql=None):
        """通过给定的SQL和数据库链接参数执行sql并返回数据
        
        Args:
            db_conf: 数据库连接参数
            sql: 执行的SQL
        Return:
            result 执行sql返回的数据
        Raise: None
        """
        if not sql:  # 如果没有sql直接返回 None
            return None

        result = None
        if not db_conf:  # 如果没有传输数据库参数就查询 应用的MySQL
            try:
                self.session = self.mysql_conn.get_session()
                self.session.execute(sql)
            except NoResultFound as e:
                ToolLog.log_error('sql execute in self App MySQL')
                ToolLog.log_error('sql execute error: {sql}'.format(sql=sql))
                ToolLog.log_error(e)
                ToolLog.log_error(traceback.format_stack())
            finally:
                self.session.close()
        else:  # 执行指定db_conf的SQL
            try:
                mysql_conn = MysqlConn(**db_conf)
                session = mysql_conn.get_session()
                # 执行SQL
                result = session.execute(sql).fetchall()
            except NoResultFound as e:
                ToolLog.log_error('db config: {conf}'.format(conf=db_conf))
                ToolLog.log_error('sql execute error: {sql}'.format(sql=sql))
                ToolLog.log_error(e)
                ToolLog.log_error(traceback.format_stack())
            finally:
                self.session.close()

        return result