作者:小旋风
题记:
记得上个月老大让我每个星期3 向大家发下 zabbix screen 最近7天的趋势图,心想就登录zabbix web 截几个图,发个邮件 应该很easy,
一做可不得了,30个图而且很多是超满屏的大图,再加上排版,前前后后 共发了 阿拉 一个半小时,完事后整个人都恍惚了。心想我勒个去以后星期3 不是俺的黑色星期三了嘛。
肿么办?不是说python 爬网页上数据挺嗨的嘛,搞搞呗!
思路:
1、获取zabbix web 上 所有 screen 趋势图 保存到本地
2、把本地的 screen 图 发邮件给组员
问题:
1、如何获取用于爬虫的图片URL
2、URL中的参数列表值如何获取
3、实现自动化排版
对策
1、登录zabbix web 在screen 图上 点击"查看元素",获取图片URL
2、源码调试,获取数据的来源于那几张表,及连接条件、过滤条件的具体sql。
3、模仿人的排版行为 实现代码排版逻辑
废话不说咯,上菜
#!/usr/bin/python
# -*- coding: utf-8 -*-
# author liudongfa
# date 20160217
import os
import time
import shutil
import MySQLdb
import smtplib
import requests
import datetime
from email.MIMEText import MIMEText
from email.MIMEImage import MIMEImage
from email.MIMEMultipart import MIMEMultipart
#zabbix web 登录信息
ZABBIX_HOST = 'xxxxxx'
ZABBIX_USER = '张三'
ZABBIX_PWD = '123456'
# zabbix 数据库 登录信息
ZABBIX_DB_HOST = 'localhost'
ZABBIX_DB_USER = 'zabbix'
ZABBIX_DB_PWD = 'zabbix'
ZABBIX_DB_NAME = 'zabbix'
zabbiX_DB_SOCKET='/tmp/mysql.sock'
#保存zabbix screen 图路径
GRAPH_PATH = '/tmp/zabbix_graph'
#设置 screen 图 时间段
GRAPH_PERIOD = 86400*7 # 7 day
#发件邮箱信息
mailserver = "xxxxxxxxx"
me = " xxxxxxxxx@bestpay.com
EMAIL_USERNAME = '小李子'
EMAIL_PASSWORD = '0101001'
# 获取 screen 趋势图的所有数据
def query_screens():
conn = MySQLdb.connect(host=ZABBIX_DB_HOST, user=ZABBIX_DB_USER, passwd=ZABBIX_DB_PWD,
db=ZABBIX_DB_NAME,unix_socket=zabbiX_DB_SOCKET, charset='utf8', connect_timeout=20)
cur = conn.cursor()
count = cur.execute("""
select a.name, a.screenid, b.resourceid, b.width, b.height,substring_index(ltrim(a.name),' ',1) server_name
from screens a, screens_items as b
where a.screenid=b.screenid and a.templateid<=>NULL and a.name not like '%/%' and a.name !='Zabbix Server'
order by a.name, a.screenid;
""" )
if count == 0:
result = 0
else:
result = cur.fetchall()
cur.close()
conn.close()
return result
# 根据数据 保存screen 趋势图 到本地。
def generate_graphs(screens):
login_resp = requests.post('http://%s/index.php' % ZABBIX_HOST, data={
'name': ZABBIX_USER,
'password': ZABBIX_PWD,
'enter': 'Sign in',
'autologin': 1,
})
session_id = login_resp.cookies['zbx_sessionid']
graphs = []
for i, (screen_name, screen_id, graph_id, width, height,server_name) in enumerate(screens):
params = {
'screenid': screen_id,
'graphid': graph_id,
'width': width ,
'height': height ,
'period': GRAPH_PERIOD,
'stime': datetime.datetime.utcnow().strftime('%Y%m%d%H%M%S'),
}
resp = requests.get('http://%s/chart2.php' % ZABBIX_HOST, params=params,
cookies={'zbx_sessionid': session_id})
#根据 screen_name,screen_id, graph_id 组成 file_name
file_name = '_'.join(map(str, screens[i][:3])).replace(' ', '_') + '.png'
with open(os.path.join(GRAPH_PATH, file_name), 'wb') as fp:
fp.write(resp.content)
graphs.append((file_name,screen_name,screen_id,server_name))
return graphs
# 把本地的screen 趋势图 发送给用户列表
def send_mail(screen_names, graphs, to_list):
# 创建 发送邮件信息
def _create_msg()
msg = MIMEMultipart('related')
msg['Subject'] = 'Zabbix Screen Report: %s' % screen_names
msg['From'] = me
msg['To'] = ';'.join(to_list)
msg.preamble = 'This is a multi-part message in MIME format.'
contents ="
if server_name != before_server_name:
contents +=" " % server_name
contents +=" " % screen_name
i=-1;
if server_name == before_server_name and screenid != before_screenid:
contents +=" " % screen_name
i=-1;
i+=1;
# 每2个screen图 一行
if i % 2 == 0:
contents += ' '
contents += ''
contents += " " % g_name % g_name
if i % 2 == 1:
contents += ' '
# 保存当前的 server_na me scre enid 用于 下次 排版逻辑比较
before_server_name = server_name
before_screenid = screenid
contents += "
" "
msg_text = MIMEText(contents, 'html')
msg_alternative = MIMEMultipart('alternative')
msg_alternative.attach(msg_text)
msg.attach(msg_alternative)
#print msg
return msg
try:
server = smtplib.SMTP()
server.connect(mailserver)
server.login(EMAIL_USERNAME, EMAIL_PASSWORD)
server.sendmail(me, to_list, _create_msg().as_string())
server.close()
print 'send mail Ok!'
except Exception, e:
print e
if __name__ == '__main__':
# 清空上次 screen 所有图片信息
if os.path.exists(GRAPH_PATH):
shutil.rmtree(GRAPH_PATH)
os.makedirs(GRAPH_PATH)
# get screens
all_screens = query_screens()
#print all_screens
#generate graphs
graphs = generate_graphs(all_screens)
#print graphs
# send email
send_mail('Data trend image least 7 days', graphs, ['XXXXXX@163.com',' XXXXXX@163.com']
题记:
记得上个月老大让我每个星期3 向大家发下 zabbix screen 最近7天的趋势图,心想就登录zabbix web 截几个图,发个邮件 应该很easy,
一做可不得了,30个图而且很多是超满屏的大图,再加上排版,前前后后 共发了 阿拉 一个半小时,完事后整个人都恍惚了。心想我勒个去以后星期3 不是俺的黑色星期三了嘛。
肿么办?不是说python 爬网页上数据挺嗨的嘛,搞搞呗!
思路:
1、获取zabbix web 上 所有 screen 趋势图 保存到本地
2、把本地的 screen 图 发邮件给组员
问题:
1、如何获取用于爬虫的图片URL
2、URL中的参数列表值如何获取
3、实现自动化排版
对策
1、登录zabbix web 在screen 图上 点击"查看元素",获取图片URL
2、源码调试,获取数据的来源于那几张表,及连接条件、过滤条件的具体sql。
3、模仿人的排版行为 实现代码排版逻辑
废话不说咯,上菜
#!/usr/bin/python
# -*- coding: utf-8 -*-
# author liudongfa
# date 20160217
import os
import time
import shutil
import MySQLdb
import smtplib
import requests
import datetime
from email.MIMEText import MIMEText
from email.MIMEImage import MIMEImage
from email.MIMEMultipart import MIMEMultipart
#zabbix web 登录信息
ZABBIX_HOST = 'xxxxxx'
ZABBIX_USER = '张三'
ZABBIX_PWD = '123456'
# zabbix 数据库 登录信息
ZABBIX_DB_HOST = 'localhost'
ZABBIX_DB_USER = 'zabbix'
ZABBIX_DB_PWD = 'zabbix'
ZABBIX_DB_NAME = 'zabbix'
zabbiX_DB_SOCKET='/tmp/mysql.sock'
#保存zabbix screen 图路径
GRAPH_PATH = '/tmp/zabbix_graph'
#设置 screen 图 时间段
GRAPH_PERIOD = 86400*7 # 7 day
#发件邮箱信息
mailserver = "xxxxxxxxx"
me = " xxxxxxxxx@bestpay.com
EMAIL_USERNAME = '小李子'
EMAIL_PASSWORD = '0101001'
# 获取 screen 趋势图的所有数据
def query_screens():
conn = MySQLdb.connect(host=ZABBIX_DB_HOST, user=ZABBIX_DB_USER, passwd=ZABBIX_DB_PWD,
db=ZABBIX_DB_NAME,unix_socket=zabbiX_DB_SOCKET, charset='utf8', connect_timeout=20)
cur = conn.cursor()
count = cur.execute("""
select a.name, a.screenid, b.resourceid, b.width, b.height,substring_index(ltrim(a.name),' ',1) server_name
from screens a, screens_items as b
where a.screenid=b.screenid and a.templateid<=>NULL and a.name not like '%/%' and a.name !='Zabbix Server'
order by a.name, a.screenid;
""" )
if count == 0:
result = 0
else:
result = cur.fetchall()
cur.close()
conn.close()
return result
# 根据数据 保存screen 趋势图 到本地。
def generate_graphs(screens):
login_resp = requests.post('http://%s/index.php' % ZABBIX_HOST, data={
'name': ZABBIX_USER,
'password': ZABBIX_PWD,
'enter': 'Sign in',
'autologin': 1,
})
session_id = login_resp.cookies['zbx_sessionid']
graphs = []
for i, (screen_name, screen_id, graph_id, width, height,server_name) in enumerate(screens):
params = {
'screenid': screen_id,
'graphid': graph_id,
'width': width ,
'height': height ,
'period': GRAPH_PERIOD,
'stime': datetime.datetime.utcnow().strftime('%Y%m%d%H%M%S'),
}
resp = requests.get('http://%s/chart2.php' % ZABBIX_HOST, params=params,
cookies={'zbx_sessionid': session_id})
#根据 screen_name,screen_id, graph_id 组成 file_name
file_name = '_'.join(map(str, screens[i][:3])).replace(' ', '_') + '.png'
with open(os.path.join(GRAPH_PATH, file_name), 'wb') as fp:
fp.write(resp.content)
graphs.append((file_name,screen_name,screen_id,server_name))
return graphs
# 把本地的screen 趋势图 发送给用户列表
def send_mail(screen_names, graphs, to_list):
# 创建 发送邮件信息
def _create_msg()
msg = MIMEMultipart('related')
msg['Subject'] = 'Zabbix Screen Report: %s' % screen_names
msg['From'] = me
msg['To'] = ';'.join(to_list)
msg.preamble = 'This is a multi-part message in MIME format.'
contents ="
Zabbix Screen Trend graphic
" contents += "" before_server_name = '' before_screenid = '' for j,(g_name,screen_name,screenid,server_name) in enumerate(graphs): #print j with open(os.path.join(GRAPH_PATH, g_name), 'rb') as fp: msg_image = MIMEImage(fp.read()) msg_image.add_header('Content-ID', "<%s>" % g_name) msg.attach(msg_image) # 根据 server_name 、 screen_name 排版 【
标签是使内容在页面上原样输出,copy 代码时记得去掉】
if server_name != before_server_name:
contents +=" " % server_name
contents +=" " % screen_name
i=-1;
if server_name == before_server_name and screenid != before_screenid:
contents +=" " % screen_name
i=-1;
i+=1;
# 每2个screen图 一行
if i % 2 == 0:
contents += ' '
contents += ''
contents += " " % g_name % g_name
if i % 2 == 1:
contents += ' '
# 保存当前的 server_na me scre enid 用于 下次 排版逻辑比较
before_server_name = server_name
before_screenid = screenid
contents += "
%s: | |
%s | |
%s | |
msg_text = MIMEText(contents, 'html')
msg_alternative = MIMEMultipart('alternative')
msg_alternative.attach(msg_text)
msg.attach(msg_alternative)
#print msg
return msg
try:
server = smtplib.SMTP()
server.connect(mailserver)
server.login(EMAIL_USERNAME, EMAIL_PASSWORD)
server.sendmail(me, to_list, _create_msg().as_string())
server.close()
print 'send mail Ok!'
except Exception, e:
print e
if __name__ == '__main__':
# 清空上次 screen 所有图片信息
if os.path.exists(GRAPH_PATH):
shutil.rmtree(GRAPH_PATH)
os.makedirs(GRAPH_PATH)
# get screens
all_screens = query_screens()
#print all_screens
#generate graphs
graphs = generate_graphs(all_screens)
#print graphs
# send email
send_mail('Data trend image least 7 days', graphs, ['XXXXXX@163.com',' XXXXXX@163.com']
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30109892/viewspace-1992503/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/30109892/viewspace-1992503/