在服務器上使用python自動獲取zabbix上圖形併發送郵件

因爲某些需求,須要天天發送郵件給相關人員,其中包含前一天的zabbix監控圖形,天天登錄並手動發送的話很麻煩。php

本着簡單重複的工做交給機器作的原則,寫了個python程序自動獲取圖形併發送。html

大體的思路是:python

  模擬登錄zabbix ---> 找到須要的圖像並下載到本地 --->使用python發送郵件服務器

1、在服務器上模擬登錄zabbix,而且將須要的圖像下載到本地cookie

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import HTMLParser
import urlparse
import urllib
import urllib2
import cookielib
import string
import os

# 登陸的主頁面
hosturl = 'http://zabbix.example.com/screens.php?elementid=26&sid=fbc2974a32b8dc87'  # 根據本身的實際地址填寫
# post數據接收和處理的頁面(咱們要向這個頁面發送咱們構造的Post數據)
posturl = 'http://zabbix.example.com/index.php'  # 從數據包中分析出,處理post請求的url

# 設置一個cookie處理器,它負責從服務器下載cookie到本地,而且在發送請求時帶上本地的cookie
cj = cookielib.LWPCookieJar()
cookie_support = urllib2.HTTPCookieProcessor(cj)
opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)
urllib2.install_opener(opener)

# 打開登陸主頁面(他的目的是從頁面下載cookie,這樣咱們在再送post數據時就有cookie了,不然發送不成功)
h = urllib2.urlopen(hosturl)

# 構造header,通常header至少要包含一下兩項。這兩項是從抓到的包裏分析得出的。
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:14.0) Gecko/20100101 Firefox/14.0.1',
           'Referer': '******'}
# 構造Post數據,他也是從抓大的包裏分析得出的。
postData = {
    'name': 'username',    # 用戶名
    'password': 'passwd',   # 密碼
    'autologin': 1,
    'enter': 'Sign in'
}

# 須要給Post數據編碼
postData = urllib.urlencode(postData)

# 經過urllib2提供的request方法來向指定Url發送咱們構造的數據,並完成登陸過程
request = urllib2.Request(posturl, postData, headers)
response = urllib2.urlopen(request)
text = response.read()


def get_graph(host, graphid, period, image_name):
    
    path = '/opt/daily_mail/image/'  # 保存圖片的地址
    #zabbix的圖片的地址的構造
    url = "http://%s/chart2.php?graphid=%s&period=%s&width=800&height=100" % (host, graphid, period)

    img_req = urllib2.Request(url)
    png = urllib2.urlopen(img_req).read()

    file = path + image_name + '.png'
    with open(file,'wb') as f:
        f.write(png)

host = 'zabbix.example.com'    // 你的zabbix服務域名
get_graph(host, 1237, 86400, 'cpu_load')
get_graph(host, 1239, 86400, 'net_traffic')
get_graph(host, 918, 86400, '155_eth0')

2、將圖像下載到本地以後,須要再使用python來自動發送郵件,網上有不少發送郵件的教程併發

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
import data
import time

mailto_list=['xxx@example.com']   # 收件人列表
mailcc_list=['xxx@example.com']   # 抄送列表
mail_host="smtp.example.com:25"   # 郵件服務器
mail_user="username"              # 用戶名
mail_pass="passwd"                # 密碼
mail_postfix="example.com"        #  郵件後綴

html = """<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<p>
服務器 CPU user time 的24h截圖<br>
<img src="cid:cpu_load" />
</p>
<p>
服務器 net outging 的24h截圖<br>
<img src="cid:net_traffic" />
</p>
<p>
服務器 eth0 24h出口帶寬 的24h截圖<br>
<img src="cid:155_eth0" />
</p>
"""

def send_mail(to_list, cc_list, sub):
    # 增長圖片
    def addimg(src, imgid):
        fp = open(src, 'rb')
        msgImage = MIMEImage(fp.read())
        fp.close()
        msgImage.add_header('Content-ID', imgid)
        return msgImage

    msg = MIMEMultipart('related')
    #HTML代碼
    msgtext = MIMEText(data.html, "html", "utf-8")
    msg.attach(msgtext)

    # 全文件路徑,後者爲ID 根據ID在HTML中插入的位置
    msg.attach(addimg("/opt/daily_mail/image/cpu_load.png", "cpu_load"))
    msg.attach(addimg("/opt/daily_mail/image/net_traffic.png", "net_traffic"))
    msg.attach(addimg("/opt/daily_mail/image/155_eth0.png", "155_eth0"))

    me = mail_user + "@" + mail_postfix 
    msg['Subject'] = sub
    msg['From'] = me
    msg['To'] = ",".join(to_list)
    msg['Cc'] = ",".join(cc_list)
    send_to = to_list + cc_list
    try:
        server = smtplib.SMTP()
        server.connect(mail_host)
        server.login(mail_user, mail_pass)
        server.sendmail(me, send_to, msg.as_string())
        server.close()
        return True
    except Exception, e:
        print str(e)
        return False

if __name__ == '__main__':
    title = "zabbix監控數據" + time.strftime('%Y%m%d',time.localtime(time.time()))
    if send_mail(mailto_list, mailcc_list, title):
        print "發送成功"
    else:
        print "發送失敗"

就是這麼簡單,發送的樣品就不截圖了post

模擬登錄那塊有參照網上博客,過久不記得地址了,若是做者發現請聯繫我,我加上引用地址。ui

相關文章
相關標籤/搜索