python 监视图_Python获取zabbix告警性能监控图并邮件发送

思路

通过zabbix传递给脚本的message参数,筛选出报警信息的itemid;

通过获取的itemid,在数据库中查找对应的grpahid;

拉取对应graphid的图片并保存;

将报警信息和图片组装成html;

发送邮件

脚本

获取itemid

从zabbix传来的第三个参数(message)中,通过re过滤出itemid

def get_itemid(self):

# 获取itemid

pattern = re.compile('ITEM.*?:(\d+)',re.S)

itemid = re.findall(pattern,sys.argv[3])

itemid = str(itemid).lstrip('[\'').rstrip('\']')

return itemid

获取graphid

将上一步得到的itemid传入该函数,并通过pymysql连接zabbix-server所在的数据库进行查询,得到graphid

def get_graphid(self):

itemid = self.get_itemid()

conn = pymysql.connect(host=self.host, user=self.username, password=self.password, port=3306, db='zabbix')

cur = conn.cursor()

cur.execute("SELECT graphid FROM `graphs_items` WHERE `itemid`=%s;" % itemid)

result = cur.fetchone()

cur.close()

conn.close()

graphid = re.findall(r'\d+', str(result))

graphid = str(graphid).lstrip('[\'').rstrip('\']')

print(graphid)

return graphid

获取性能监控图片url并保存至文件

def get_img(self):

time = self.time

graph_id = self.get_graphid()

img_url = 'http://' + str(self.host) +'/zabbix/' + 'chart2.php?graphid=%s&period=%s&isNow=1&profileIdx=web.graphs&profileIdx2=797&width=1000' %(graph_id,time)

print(img_url)

try:

response = requests.get(img_url,headers = self.headers)

if response.status_code == 200:

return response.content

else:

return None

except Exception as e:

print(e)

def save_img(self):

content = self.get_img()

tm = datetime.datetime.now()

time = tm.strftime("%Y-%m-%d-%H%M%S")

string = str(self.savedir) + '/' + 'zabbix_' + str(time) + '.jpg'

fp = open(string, 'wb')

fp.write(content)

fp.close()

return string

发送邮件

def sendmail(self,toemail,subject):

imgname = self.save_img()

html_text = self.convert_to_html(sys.argv[3])

smtp_host = 'smtp.qq.com'

from_email = 'zabbix@cloudcared.cn'

passwd = 'stlq'

msg = MIMEMultipart('related')

fp = open(imgname, 'rb')

image = MIMEImage(fp.read())

fp.close()

image.add_header('Content-ID', '')

msg.attach(image)

html = """

"""

html += html_text

html += ''

html += """

"""

html = MIMEText(html, 'html', 'gb2312')

msg.attach(html)

msg['Subject'] = subject

msg['From'] = from_email

smtp_server = smtplib.SMTP_SSL()

smtp_server.connect(smtp_host, '465')

smtp_server.login(from_email, passwd)

smtp_server.sendmail(from_email, toemail, msg.as_string())

smtp_server.quit()

print(imgname)

最终代码

# -*- coding:utf-8 -*-

#!/usr/local/python3/bin/python3

import smtplib

from email.mime.text import MIMEText

from email.mime.multipart import MIMEMultipart

from email.mime.image import MIMEImage

import pymysql

import re,sys,os,requests,datetime,time

class zabbix_img(object):

def __init__(self,url,host,username,password,time):

self.host = host

# 指定zabbix获取图片的地址

self.chart2_url = 'http://172.20.2.11/zabbix/chart2.php'

# zabbix登录账户

self.zabbix_user = 'Admin'

# zabbix登录密码

self.zabbix_pwd = 'zabbix'

self.username = username

self.password = password

self.url = url

self.time = time

self.alerttime = datetime.datetime.now().strftime("%Y-%m-%d-%H%M%S")

def get_itemid(self):

# 获取Itemid

pattern = re.compile('ITEM.*?(\d+)',re.S)

itemid = re.findall(pattern,sys.argv[3])

itemid = str(itemid).lstrip('[\'').rstrip('\']')

return itemid

def get_graphid(self):

itemid = self.get_itemid()

conn = pymysql.connect(host=self.host, user=self.username, password=self.password, port=3306, db='zabbix')

cur = conn.cursor()

cur.execute("SELECT graphid FROM `graphs_items` WHERE `itemid`=%s;" % itemid)

result = cur.fetchone()

cur.close()

conn.close()

graphid = re.findall(r'\d+', str(result))

graphid = str(graphid).lstrip('[\'').rstrip('\']')

print(graphid)

return graphid

def get_img(self):

graphid = self.get_graphid()

# 拉取图片

os.system('curl -L -c /usr/lib/zabbix/alertscripts/cookie.txt --user-agent Mozilla/4.0 -d "reauest=&name=%s&password=%s&autologin=1&enter=Sign+in" %s' % (self.zabbix_user, self.zabbix_pwd, self.url))

os.system('curl -c /usr/lib/zabbix/alertscripts/cookie.txt -b /usr/lib/zabbix/alertscripts/cookie.txt --user-agent Mozilla/4.0 -F "graphid=%s" -F "period=%s" -F "width=900" %s > /usr/lib/zabbix/img/zabbix_%s.png' % (graphid, self.time, self.chart2_url, str(self.alerttime)))

img_name = '/usr/lib/zabbix/img/' + 'zabbix_' + str(self.alerttime) + '.png'

print(img_name)

return img_name

def convert_to_html(self,text):

d = text.splitlines()

html_text = ''

for i in d:

i = '' + i + ''

html_text += i + '\n'

return html_text

def sendmail(self,toemail,subject):

imgname = self.get_img()

html_text = self.convert_to_html(sys.argv[3])

smtp_host = 'smtp.qq.com'

from_email = 'zabbix@cloudcared.cn'

passwd = 'stlqpedmjshrcahb'

msg = MIMEMultipart('related')

fp = open(imgname, 'rb')

image = MIMEImage(fp.read())

fp.close()

image.add_header('Content-ID', '')

msg.attach(image)

html = """

"""

html += html_text

html += ''

html += """

"""

html = MIMEText(html, 'html', 'gb2312')

msg.attach(html)

msg['Subject'] = subject

msg['From'] = from_email

smtp_server = smtplib.SMTP_SSL()

smtp_server.connect(smtp_host, '465')

smtp_server.login(from_email, passwd)

smtp_server.sendmail(from_email, toemail, msg.as_string())

smtp_server.quit()

print(imgname)

def main():

url = 'http://172.20.2.11/zabbix/index.php'

host = '172.20.2.11'

username = 'zabbix'

password = 'zabbix'

time = '600'

to = sys.argv[1]

subject = sys.argv[2]

zabbixOper = zabbix_img(url,host,username,password,time)

zabbixOper.get_img()

zabbixOper.sendmail(to,subject)

if __name__ == '__main__':

main()

测试

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值