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)
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
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)
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())
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
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
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())
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
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
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
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
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
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
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
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
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
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