#!/usr/bin/python3 # -*- coding: utf-8 -*- import smtplib import os import subprocess from email.mime.text import MIMEText from email.header import Header from email.mime.multipart import MIMEMultipart from datetime import datetime """ 检查作业成功率,并将结果发送邮件 """ #公共的 now=os.path.dirname(os.path.abspath(__file__)) file_path=os.path.join(now,"check_report.txt") week = str(datetime.now().isocalendar()[1]) # 发送邮件 def send_mail(): # 发件人 sender = 'mh@una-mail.com' # 接收邮件,可以发给多人 receivers = ['mh@una-mail.com','dhx@una-mail.com'] # 邮件主体 msg = MIMEMultipart() # 正文取文本中的内容 with open(file_path, "r") as f: msgdata = f.read() message = "第{0}周,长期任务的作业成功率如下:\n{1}".format( week, msgdata) msg.attach(MIMEText(message, 'plain', _charset="utf-8")) # 发送者 msg['From'] = Header(sender, 'utf-8') # 接收者 msg['To'] = Header(receivers[0], 'utf-8') # 主题 subject = '【长期任务】第W{0}周作业成功率情况'.format(week) msg['Subject'] = Header(subject, 'utf-8') # 附件信息 #att = MIMEText(open(file_week_path, 'rb').read(), 'base64', 'utf-8') #att["Content-Type"] = 'application/octet-stream' #att["Content-Disposition"] = 'attachment; filename="{}"'.format( # file_name_week) #msg.attach(att) try: smtpObj = smtplib.SMTP('10.10.110.102') #身份认证 smtpObj.login(sender,"111111") smtpObj.sendmail(sender, receivers, msg.as_string()) print("邮件发送成功") except smtplib.SMTPException: print("Error: 无法发送邮件") def run_sql(commdline): result=subprocess.run(commdline,capture_output=True,text=True) return result.stdout def get_need_tables(): # 先查询出所有的tbl_jobhistory表 SQL_TABLES="SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='unary' AND TABLE_NAME regexp 'tbl_jobhistory(_2)|^tbl_jobhistory$'" # 触发查询 #RESULT_TABLES=`mysql -u$MYSQLUSER -p$MYSQLPWD -e "$SQL_TABLES" 2>/dev/null|awk 'NR>1'` RESULT_TABLES=None commdline = ["mysql", "-uunadba", "-p1223Bc@2008", "-e", SQL_TABLES] result = run_sql(commdline) tables_list = result.split('\n')[1:-1] return tables_list def get_policy_tasks(id,name): #拼接所有的表 ALLJOBHISTORY = [] for table in check_tables: JOBHISTORY = "select operdesc,count(*) as n2 from " JOBHISTORY += table JOBHISTORY += " where policyname=\'" JOBHISTORY += name JOBHISTORY += "\' and compid=\'" JOBHISTORY += id JOBHISTORY += "\' group by operdesc" ALLJOBHISTORY.append(JOBHISTORY) ALLJOBHISTORY_SQL = " UNION ALL ".join(ALLJOBHISTORY) #最终查询的语句 check_sql = "select operdesc,sum(n2) as num from ("+ ALLJOBHISTORY_SQL + ") b group by b.operdesc" all_num = "select sum(num) as num1 from (" + check_sql +") t1" # 总个数 commdline = ["mysql", "-uunadba", "unary","-p1223Bc@2008", "-e", all_num] result = run_sql(commdline) # 处理异常 if result.stdout is None: assert False,'select error' # 失败的 failed_num_sql = "select sum(num) as num1 from (" + check_sql +") t1 where t1.operdesc like '%失败%' " failed_commdline = ["mysql", "-uunadba", "unary","-p1223Bc@2008", "-e", failed_num_sql] result_failed = run_sql(failed_commdline) if result_failed.stdout is None: failed_num = 0 # 成功的 success_num_sql = "select sum(num) as num1 from (" + check_sql +") t1 where t1.operdesc like '%成功%' " success_commdline = ["mysql", "-uunadba", "unary","-p1223Bc@2008", "-e", success_num_sql] result_success = run_sql(success_commdline) return result def get_angent_sucessful(bkinfo): # 获取策略的结果 policy_datas=[] for name in bkinfo['policyName']: policy_result=get_policy_tasks(bkinfo['agentID'],name) policy_datas.append(policy_result) # 合并处理 check_result="" # 返回结果 return check_result def main(): # 需要查询的数据 # data={ # "mysql物理":{"agentID":"2a0df1771995da56fc60663293bd92da","policyName":["长期任务-mysql物理多通道"]}, # "Oracle物理":{"agentID":"2752836e63174d405e3e9cb5cf493d4a","policyName":["长期Oracle多通道"]}, # "zstack":{"agentID":"48CB24F42D8048FCA9DA1D6498CE66FC","policyName":["bk1"]}, # "MySQLCDM":{"agentID":"be98d51cd9658ed982a3c3e411633418","policyName":["长期"]}, # "OracleCDM":{"agentID":"d0003e0c3da5730a7252fe973aec538b","policyName":["长期"]}, # "sanforscp":{"agentID":"45CE47DCD8D14C79BA9A4CD8BF3160CA","policyName":["长期"]}, # "OracleCLP":{"agentID":"2737975f-15c3-4716-968a-fc8ab2e9f1fc","policyName":["长期clp"]}, # "文件定时":{"agentID":"dc62d38f7e8ad92d2bdc77e0760173e6","policyName":["多通道","普通"]}, # "PG物理":{"agentID":"289063a564255daff1f211fb7e1db3b0","policyName":["pg物理挂载备份长期"]}, # "VMwareCDM":{"agentID":"3D661E09C4F0456B97FBFBA5386C70D8","policyName":["长期"]}, # } data={ "vmware":{"agentID":"22CDE0BCDE104B0C8596009D236383AA","policyName":["复现"]}, "vmware2":{"agentID":"22CDE0BCDE104B0C8596009D236383AA","policyName":["复现2"]}, } # 获取所需要查询的表 global check_tables check_tables=get_need_tables() # 以此遍历查询 sucessfuldata={} for bktype,bkinfo in data.items(): # 获取组件的作业成功率 ag_sucessful=get_angent_sucessful(bkinfo) sucessfuldata[bktype]=ag_sucessful # 保存输出到文件 # save_data(sucessfuldata) # 发邮件 #send_mail() if __name__ == '__main__': main()