mirror of
https://github.com/hastagAB/Awesome-Python-Scripts.git
synced 2024-11-30 15:31:07 +00:00
273 lines
6.7 KiB
Python
273 lines
6.7 KiB
Python
|
|
||
|
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()
|