Awesome-Python-Scripts/zabbix_api/dailyAlertMail.py

273 lines
6.7 KiB
Python
Raw Normal View History

import requests, json, sys
import time
from datetime import datetime, date, timedelta
import pprint
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import os, operator
from jinja2 import Environment, FileSystemLoader
#####################################################################
### Properties and Variables
#####################################################################
PATH = os.path.dirname(os.path.abspath(__file__))
TEMPLATE_ENVIRONMENT = Environment(
autoescape=False,
loader=FileSystemLoader(os.path.join(PATH, 'templates')),
trim_blocks=False)
url = sys.argv[1]
headers = {'content-type': 'application/json'}
pp = pprint.PrettyPrinter(indent=4)
hostIDs = []
hostDict = {}
zabbixHostWiseCount = {}
zabbixAlertWiseCount = {}
context = {}
totalCount = 0
logFile = "/tmp/dailyAlertMail.log"
logFH = open(logFile, 'a')
mailFrom = "no-reply@localdomain.com"
mailToStr = "me@example.com"
mailToList = ["me@example.com"]
###################################################################
### Functions
###################################################################
def render_template(template_filename, context):
return TEMPLATE_ENVIRONMENT.get_template(template_filename).render(context)
def getAuthToken():
authPayload = {
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": "admin",
"password": "zabbix"
},
"id": 1,
"auth": None
}
authToken = requests.post(url, data = json.dumps(authPayload), headers=headers).json()
if authToken.has_key('error'):
return [False, authToken['error']['data']]
else:
return [True, authToken['result']]
def getAllHostList():
authResult = getAuthToken()
if not authResult[0]:
# Authentication failed. Retry...
authResult = getAuthToken()
if authResult[0]:
gethosts = {
"jsonrpc": "2.0",
"method": "host.get",
"params": {
"output": "extend"
},
"auth": authResult[1],
"id": 1
}
hostlist = requests.post(url, data=json.dumps(gethosts), headers=headers).json()
hostDict = {}
hostIDs = []
for hostObj in hostlist['result']:
hostDict[hostObj['hostid']] = hostObj['host']
hostIDs.append(hostObj['hostid'])
return hostIDs, hostDict
else:
sys.exit()
def getTime():
yesterday = date.today() - timedelta(1)
reqTime = time.mktime(datetime.strptime(yesterday.strftime('%d/%m/%Y'), "%d/%m/%Y").timetuple())
return reqTime
#######################################################################
### Sending mail
#######################################################################
hostIDs, hostDict = getAllHostList()
reqTime = getTime()
pp.pprint(hostDict)
for hostid in hostIDs:
#zabbixAlerts[hostDict[hostid]] = {}
#zabbixAlerts[hostDict[hostid]]['alertWiseCount'] = {}
#zabbixHostWiseCount[hostDict[hostid]] = {}
print "working on host = " + hostDict[hostid]
zabbixAlertWiseCount[hostDict[hostid]] = {}
#zabbixAlertWiseHost[hostDict[hostid]]['alertWiseCount'] = {}
#hostWiseAlerts[hostDict[hostid]] = {}
### Get Alerts Details
authResult = getAuthToken()
if not authResult[0]:
# Authentication failed. Retry...
authResult = getAuthToken()
if authResult[0]:
alertPayload = {
"jsonrpc": "2.0",
"method": "alert.get",
"params": {
"output": "extend",
"time_from": reqTime,
"hostids": hostid
},
"auth": authResult[1],
"id": 1
}
alertList = requests.post(url, data=json.dumps(alertPayload), headers=headers).json()
### Get Events Details
eventPayload = {
"jsonrpc": "2.0",
"method": "event.get",
"params": {
"output": "extend",
"time_from": reqTime,
"hostids": hostid
},
"auth": authResult[1],
"id": 1
}
eventList = requests.post(url, data=json.dumps(eventPayload), headers=headers).json()
## get only PROBLEM EVENTS
problemEvents = []
for prob in eventList['result']:
if prob['source'] == '0' and prob['value'] == '1':
problemEvents.append(prob['eventid'])
#zabbixAlerts[hostDict[hostid]]['totalAlertCount'] = len(problemEvents)
zabbixHostWiseCount[hostDict[hostid]] = len(problemEvents)
totalCount += len(problemEvents)
print "total alerts for host: " + str(zabbixHostWiseCount[hostDict[hostid]])
for alert in alertList['result']:
#key = alert['eventid']
#if alert['eventid'] in problemEvents and not alertDict.has_key(key):
# alertDict[key] = {}
# alertDict[key]['host'] = hostDict[hostid]
# alertDict[key]['message'] = alert['subject']
# alertDict[key]['time'] = datetime.fromtimestamp(int(alert['clock'])).strftime('%Y-%m-%d %H:%M:%S')
if alert['eventid'] in problemEvents:
# hostWiseAlerts[hostDict[hostid]][alert['subject']] = hostWiseAlerts[hostDict[hostid]].get(alert['subject'], 0) + 1
#zabbixAlerts[hostDict[hostid]]['alertWiseCount'][alert['subject']] = zabbixAlerts[hostDict[hostid]]['alertWiseCount'].get(alert['subject'], 0) + 1
zabbixAlertWiseCount[hostDict[hostid]][alert['subject']] = zabbixAlertWiseCount[hostDict[hostid]].get(alert['subject'], 0) + 1
#pp.pprint(zabbixAlerts[hostDict[hostid]])
## Get Host wise count
#hostWiseCount[hostDict[hostid]] = len(problemEvents)
print "alerts for this host: "
pp.pprint(zabbixAlertWiseCount[hostDict[hostid]])
if len(zabbixAlertWiseCount[hostDict[hostid]].keys()) == 0:
# No alerts for this host. Delete it
del zabbixAlertWiseCount[hostDict[hostid]]
else:
sys.exit()
#######################################################################
### Sending mail
#######################################################################
yesterday = date.today() - timedelta(1)
yesterdayTime = yesterday.strftime('%d/%m/%Y')
msg = MIMEMultipart('alternative')
msg['Subject'] = "Zabbix alerts for " + yesterdayTime
msg['From'] = mailFrom
msg['To'] = mailToStr
context['count'] = totalCount
#context['zabbixAlerts'] = {}
context['zabbixHostWiseCount'] = {}
context['zabbixHostWiseCount'] = zabbixHostWiseCount
context['zabbixAlertWiseCount'] = {}
context['zabbixAlertWiseCount'] = zabbixAlertWiseCount
html = render_template('email_template.html', context)
html = MIMEText(html, 'html')
msg.attach(html)
# Send using postflix
s = smtplib.SMTP('localhost')
s.sendmail(mailFrom, mailToList, msg.as_string())
#s.sendmail("digitalgoldzabbix@local.com", ['sunny1.gupta@paytm.com'], msg.as_string())
s.quit()
logText = "{0} events occured on {1}".format(totalCount, yesterdayTime)
logFH.write(logText)
logFH.write('\n')
logFH.write(str(zabbixHostWiseCount))
logFH.write('\n')
logFH.write(str(zabbixAlertWiseCount))
logFH.write('\n')
logText = "Mail Sent"
logFH.write(logText)
logFH.write('\n')
logFH.write("====================================")
logFH.close()