Zabbix Screen report 趋势图邮件自动发送

作者:小旋风

题记:
记得上个月老大让我每个星期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/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值