168 lines
5.8 KiB
Python
168 lines
5.8 KiB
Python
#!/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()
|