脚本处理逻辑分析:
通过zabbix传递给脚本的message参数,筛选出报警信息的itemid;
通过itemid获取到图片并保存;
将报警信息和图片组装成html;
发送邮件。
后续脚本里面的处理细节还会在进一步分析,将脚本中涉及到的代码行进行注释分析
#!/usr/bin/env python
#coding=utf-8
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
import MySQLdb,smtplib,sys,os,time,re
import graph
import logging
import logging.config
import logging.handlers
import traceback
import requests
#日志输出配置格式
logger = logging.getLogger("root")
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter("[%(asctime)s %(filename)s:%(lineno)s - %(funcName)15s()] %(message)s")
#日志输出位置,到指定/hskj/logs/Data_sheet.log这个文件,从系统规划上,日志统一放置到这个地方
handler = logging.handlers.RotatingFileHandler("/hskj/logs/altermail_img.log")
handler.setFormatter(formatter)
logger.addHandler(handler)
user='USER'
#zabbix用户名
password='PASSWORD'
#zabbix密码
url='http://IP/zabbix/'
#zabbix首页
period='3600'
chart2_url='http://IP/chart2.php'
#zabbix获取图片url http://IP/chart2.php
mysql_host='localhost'
mysql_user='root'
mysql_pass='MYSQLPASSWD'
mysql_db='zabbix'
#zabbix数据库相关信息
graph_path='/usr/local/zabbix/alertscripts/'
#图片保存路径
def get_itemid():
#获取itemid
a=re.findall(r"ITEM ID:\d+",sys.argv[3])
i=str(a)
itemid=re.findall(r"\d+",i)
logger.info(itemid)
return str(itemid).lstrip('[\'').rstrip('\']')
def get_graphid(itemid):
#获取graphid
conn =MySQLdb.connect(host=mysql_host,user=mysql_user,passwd=mysql_pass,db=mysql_db,connect_timeout=20)
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))
logger.info(graphid)
return str(graphid).lstrip('[\'').rstrip('\']')
#get grafa#
def get_graph(itemID,pName=None):
myRequests = requests.Session()
HOST='IP'
try:
"""
获取性能图,首先需要登录
通过分析,可以直接Post/Get方式登录
"""
loginUrl = "http://%s/zabbix/index.php" % HOST
loginHeaders={
"Host":HOST,
"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
}
# 构建登录所需的信息
playLoad = {
"name":"USER",
"password":'PASSWORD',
"autologin":"1",
"enter":"Sign in",
}
# 请求登录
res = myRequests.post(loginUrl,headers=loginHeaders,data=playLoad)
"""
登入状态后,在POST数据中加入itemid
"""
testUrl = "http://%s/zabbix/chart.php" % HOST
testUrlplayLoad = {
"period" :"10800",
"itemids[0]" : itemID,
"type" : "0",
"profileIdx" : "web.item.graph",
"width" : "700",
}
testGraph = myRequests.get(url=testUrl,params=testUrlplayLoad)
# 返回图片源码,直接保存到本地
IMAGEPATH = os.path.join('/usr/local/zabbix/alertscripts/imges/', pName)
f = open(IMAGEPATH,'wb')
f.write(testGraph.content)
f.close()
pName = '/usr/local/zabbix/alertscripts/imges/' + pName
return pName
except Exception as e:
print e
return False
def text_transfe_html(text):
#将message转换为html
d=text.splitlines()
html_text=''
for i in d:
i='' + i + '</br>'
html_text+=i + '\n'
return html_text
def send_mail(to_email,subject,picture_name):
#发送邮件
graph_name=get_graph(itemid,picture_name)
html_text=text_transfe_html(sys.argv[3])
smtp_host = 'MAIL_SERVER'
from_email = 'FROM'
#邮箱账户
passwd = 'PASSWD'
#邮箱密码
msg=MIMEMultipart('related')
fp=open(graph_name,'rb')
image=MIMEImage(fp.read())
fp.close()
image.add_header('Content-ID','<image1>')
msg.attach(image)
html="""
<html>
<body>
"""
html+=html_text
html+='<img src="cid:image1"></br>'
html+="""
</body>
</html>
"""
html=MIMEText(html,'html','utf8')
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,to_email,msg.as_string())
smtp_server.quit()
if __name__ == '__main__':
time_tag=time.strftime("%Y%m%d%H%M%S", time.localtime())
to=sys.argv[1]
subject=sys.argv[2]
subject=subject.decode('utf-8')
itemid=get_itemid()
#graphid=get_graphid(itemid)
picture_name=time_tag + ".png"
graph_name=get_graph(itemid,picture_name)
send_mail(to,subject,picture_name)
执行结果图片:

参考连接:http://www.bubuko.com/infodetail-1678696.html
参考:微信公众号: 数睿技术
- zabbix 告警实践分享 一键实现zabbix 电话、邮件、微信告警
众所周知Zabbix 是一款用来监控IT基础设施的监控套件,同时也具有很多方便运维人员使用的优秀功能,如:支持多条件告警,支持多种告警方式,支持多组模板.支持模板继承,因此在众多的开源运维监控软件中独 ...
- zabbix 告警小试
zabbix 告警小试 1. 实验内容简述 本次实验,旨在通过zabbix监控,实现对告警信息的实时通知,主要用到了zabbix中的item.trigger.action.user.user grou ...
- 通过微信服务号推送Zabbix告警
近期看到一篇通过微信实现Zabbix告警的文章,但实践时发现,无法成功发送消息. 分析原因,应该是微信公众平台加强了登录验证,在登录时会需要管理员进行扫描二维码操作才能成功登陆后台: 而之前文章中的A ...
- 一个简单好用的zabbix告警信息发送工具
之前使用邮件和短信发送zabbix告警信息,但告警信息无法实时查看或者无法发送,故障无法及时通知运维人员. 后来使用第三方微信接口发送信息,愉快地用了一年多,突然收费了. zabbix告警一直是我的痛 ...
- [置顶]
个人微信号发送zabbix告警信息
之前使用邮件和短信发送zabbix告警信息,但告警信息无法实时查看或者无法发送,故障无法及时通知运维人员. 后来使用第三方微信接口发送信息,愉快地用了一年多,突然收费了. zabbix告警一直是我的痛 ...
- [置顶]
一个简单好用的zabbix告警信息发送工具
之前使用邮件和短信发送zabbix告警信息,但告警信息无法实时查看或者无法发送,故障无法及时通知运维人员. 后来使用第三方微信接口发送信息,愉快地用了一年多,突然收费了. zabbix告警一直是我的痛 ...
- zabbix告警邮件美化
为了更好的用户体验,我们需要尽量美化我们的输出内容,尽量做到整齐划一,让人看了会有很舒服的感觉, 这个好像和苹果的产品一样,给人一种美感让人感觉非常享受. 一般我们的zabbix告警邮件就是纯文字,建 ...
- CMDB机柜平台结合zabbix告警展示
前段时间看了刘天斯老师的机柜展示平台,非常绚丽,而且有大屏显示的话也是能够体现运维价值的.刚好最近自己也在协助朋友做一个开源的CMDB平台,这里就说下我们CMDB平台的一些数据: 开源项目地址:Git ...
- Java发送邮件时标题和发件人乱码
最近碰到一个问题,Java发送邮件时,查看邮箱结果,发件人及邮件标题正文全部乱码 通过翻阅资料,原因及解决方法如下: // Set Subject: 头字段 message.setSubject(Mi ...
随机推荐
- Django中间件2
前戏 我们在前面的课程中已经学会了给视图函数加装饰器来判断是用户是否登录,把没有登录的用户请求跳转到登录页面.我们通过给几个特定视图函数加装饰器实现了这个需求.但是以后添加的视图函数可能也需要加上装饰 ...
- 总线复习之SPI
SPI总线协议以ds1302为例讲解 1.1概述. 1.2根据时序图来分析. 1.3再熟读一下DS1302的数据手册和SPI总线协议的使用. 1.4结合ds1302功能实现一定的功能. 1.1概述SP ...
- SPOJ-LCS Longest Common Substring 【后缀自动机】
题目分析: 用没出现过的字符搞拼接.搞出right树,找right集合的最小和最大.如果最小和最大分居两侧可以更新答案. 代码: #include<bits/stdc++.h> using ...
- CF95C Volleyball
题意翻译 给出一个图,双向边,边上有权值代表路的距离,然后每个点上有两个值,t,c,t代表能从这个点最远沿边走t,且不能在半路下来,花费是c 现在告诉你起点终点,问最少的花费 点个数1000,边个数1 ...
- 【CF1151E】Number of Components
[CF1151E]Number of Components 题面 CF 题解 联通块个数=点数-边数. 然后把边全部挂在较小的权值上. 考虑从小往大枚举左端点,等价于每次删掉一个元素,那么删去点数,加 ...
- 「线性基」学习笔记and乱口胡总结
还以为是什么非常高大上的东西花了1h不到就学好了 线性基 线性基可以在\(O(nlogx)\)的时间内计算出\(n\)个数的最大异或和(不需要相邻). 上述中\(x\)表示的最大的数. 如何实现 定义 ...
- vuetify | vue | 文件上传组件 | file | upload | form input[type="file"]
今天无聊地写vuecli3听歌的时候,遇到了上传文件到Django的自我需求,然后就到vuetify的表单组件里找upload btn,发现居然没有!!! 顿时惊了个呆,要知道之前用element做操 ...
- MySQL的SQL_Mode修改小计
问题复现 今天突然发现MySQL服务器升级之后sql_mode变成宽松摸索了,危害如下: 临时解决 set global sql_mode='strict_trans_tables'(阿里服务器默认是 ...
- linux服务器间文件夹拷贝
要求,在A机器执行脚本,把A机器的某个目录文件拷贝到B机器. 第一版ftp实现: 1.A 机器先安装 ftp 客户端 $ sudo yum install ftp 2.B机器安装ftp服务端 $ su ...
- java实现sftp客户端上传文件夹的功能
使用的jar: <dependencies> <dependency> <groupId>jsch</groupId> <artifactId&g ...