Linux帆软报表服务图片显示红叉,Zabbix通过邮件发送Screen图形报表实现

在使用Zabbix的过程中,我们通常会建立一些需要的Screen图形报表来汇总需要监控的Graph。

而下面的两个脚本,则是通过从Zabbix数据库中获取所有的Screen图形参数,提供Zabbix的WEB接口将所有图形保存到本地,然后通过脚本以Email形式发送过来,作为每天的自动报表。

$ sudo mkdir -p /data/script

$ sudo mkdir -p /data/graph

$ sudo vim /data/scripts/save-graph.pl

#!/usr/bin/perl

use File::Path;

use DBI;

my $path = '/data/graph';

if(-e $path) { rmtree($path); }

mkdir($path);

my $stime = `date +%Y%m%d`; chop($stime); $stime .= '1000';

if( length($stime) != 12 ) { print "Error get date"; exit; }

my $period = 86400;    # 24 hours

my $login = 'admin';  # Zabbix Web User

my $pass = 'password'; # Zabbix Web User Password, must be URL Encoded

my $cook = "/tmp/cookie";

my $dsn = 'DBI:MySQL:zabbix:localhost'; # Connect MySQL DB "zabbix" on localhost

my $db_user_name = 'zabbix'; # MySQL DB user

my $db_password = 'dbpassword'; # MySQL DB user password

my $dbh = DBI->connect($dsn, $db_user_name, $db_password);

my $sth = $dbh->prepare(qq{select a.name,a.hsize,a.vsize, b.resourceid, b.width, b.height,b.x,b.y from screens a,screens_items as b where a.screenid=b.screenid and a.templateid<=>NULL order by a.name});

$sth->execute();

my %screens;

# Get all graphs by using curl

while (my ($name,$hsize,$vsize, $id,$width,$height,$x,$y) = $sth->fetchrow_array())

{

if(length($id) > 2){

#print "$id => $ids\n";

my $p = "$path/$name.$hsize.$vsize.$y.$x.$id.png";

my $strcomm  = `curl  -c $cook -b $cook -d "request=&name=$login&password=$pass&autologin=1&enter=Sign+in"  localhost/zabbix/index.php`;

$strcomm  = `curl  -b $cook -F  "graphid=$id" -F "period=$period" -F "stime=$stime" -F "width=$width" -F "height=$height" localhost/zabbix/chart2.php > $p`;

}

}

exit ;

$ sudo vim email-pic.py

#! /usr/bin/env Python

import os

import smtplib

from email.MIMEMultipart import MIMEMultipart

from email.MIMEText import MIMEText

from email.MIMEImage import MIMEImage

def _sendmail(smtp_server,port,account,password,str_from,list_to,msg):

smtp = smtplib.SMTP(smtp_server,port)

smtp.ehlo()

smtp.starttls()

smtp.ehlo()

smtp.login(account, password)

smtp.sendmail(str_from, list_to,msg)

smtp.close()

def _get_pictures(image_dir):

pictures = []

for f in os.listdir(image_dir):

pictures.append(f)

return pictures

def _create_msg(screen_name,screens,image_dir,str_from,list_to):

msgRoot = MIMEMultipart('related')

msgRoot['Subject'] = 'Zabbix Screen Report: %s' % screen_name

msgRoot['From'] = str_from

msgRoot['To'] = ",".join(list_to)

msgRoot.preamble = 'This is a multi-part message in MIME format.'

# Encapsulate the plain and HTML versions of the message body in an

# 'alternative' part, so message agents can decide which they want to display.

msgAlternative = MIMEMultipart('alternative')

msgRoot.attach(msgAlternative)

msgText = MIMEText('This is the alternative plain text message.')

msgAlternative.attach(msgText)

contents = ""

contents += "

Screen %s


" % screen_name

_,hsize,vsize,_,_,_,_,= tuple(screens[0].split('.'))

contents +="

screens = sorted(screens)

y= -1

for f in screens:

items = f.split('.')

_,_,_,image_y,image_x,image_id,_ = tuple(items)

image_name = "image-%s-%s" % (screen_name, image_id)

fp = open('%s/%s' % (image_dir,f), 'rb')

msgImage = MIMEImage(fp.read())

fp.close()

msgImage.add_header('Content-ID', "" % image_name)

msgRoot.attach(msgImage)

if y != image_y:

if y!= -1:

contents +=""

y = image_y

contents +="

"

        contents +="

" % image_name

contents += "

"

msgText = MIMEText(contents, 'html')

msgAlternative.attach(msgText)

msgRoot.attach(msgAlternative)

return msgRoot

# Create the root message and fill in the from, to, and subject headers

def main(str_from,list_to,image_dir):

pictures = _get_pictures(image_dir)

for screen_name in list(set([x.split('.')[0] for x in pictures ])):

screens = [x for x in pictures if x.startswith(str(screen_name) + '.') ]

msgRoot = _create_msg(screen_name,screens,image_dir,str_from,list_to)

_sendmail('smtp.example.com',25,'username','password',str_from,list_to,msgRoot.as_string())

if __name__ == '__main__':

str_from = 'username@example.com'

list_to = [

"jack@example.com", "tom@example.com", "jim@example.com"

]

image_dir = '/data/graph'

main(str_from,list_to,image_dir)

接着,将这两个脚本加入到crontab中定时执行。

$ sudo crontab -e

30 23 * * * /data/script/save-graph.pl

55 23 * * * /data/script/email-pic.py

这样,就可以收到对应的Zabbix图形邮件报表了,如下图所示:

f1f46e98d7d4c8133b73ecdcdac68d4c.png

-------------------------------分割线-------------------------------

1、按周显示:

my $period = 86400; 这里就是用来定义时间的,以秒为单位。

2、执行python时出错,麻烦帮助看一下。python2.6\2.7版本都试过

Traceback (most recent call last):

File "./email-pic.py", line 80, in

main(str_from,list_to,image_dir)

File "./email-pic.py", line 71, in main

msgRoot = _create_msg(screen_name,screens,image_dir,str_from,list_to)

File "./email-pic.py", line 41, in _create_msg

_,hsize,vsize,_,_,_,_,= tuple(screens[0].split('.'))

IndexError: list index out of range

必须和上面的脚本和步骤配合使用,完成的任务其实就是,创建目录,利用Zabbix接口生成好好图片,然后通过邮件发送。0b1331709591d260c1c78e86d0c51c18.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值