Added ZabbixAPI program to get events happened in last 24 hours

This commit is contained in:
Sunny Gupta 2018-10-03 20:46:40 +05:30
parent 2c1cfb62f5
commit ddb5f4822d
2 changed files with 313 additions and 0 deletions

View File

@ -0,0 +1,272 @@
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()

View File

@ -0,0 +1,41 @@
<!DOCTYPE html>
<html>
<body>
<center>
<h1>Total Zabbix alerts {{ count }}</h1>
<br>
</center>
<ol align="left">
Host Wise count:
<br>
{% for host, count in zabbixHostWiseCount.items() %}
<tr>
<td>{{ host }}</td>
<td>{{ count }}</td>
</tr>
{% endfor %}
<br>
Alerts:
<br>
{% for host in zabbixAlertWiseCount.keys() %}
Host: {{ host }}
<tr>
<td>Alert</td>
<td>Count</td>
</tr>
{% for hostAlertMessage, count in zabbixAlertWiseCount[host].items() %}
<tr>
<td>{{ hostAlertMessage }}</td>
<td>{{ count }}</td>
</tr>
{% endfor %}
<br>
{% endfor %}
</body>
</html>