isengard-bot/serviceData.py

184 lines
8.3 KiB
Python

import datetime
class ServiceData:
def __init__(self, linkedBot):
self.serviceData = {}
self.maintainerData = {}
self.linkedBot = linkedBot
def flush(self):
for host in self.serviceData:
if not isinstance(self.serviceData[host], dict):
continue
maintainer = self.serviceData[host]["maintainer"]
if self.serviceData[host]["needUpdate"]:
destmuc = self.serviceData[host]["destmuc"]
text = self.serviceData[host]["text"]
msg = "(néant)"
if self.serviceData[host]["status_type"] == "PROBLEM":
msg = "{}, je détecte un problème sur {} ({})".format(maintainer, host, text)
elif self.serviceData[host]["status_type"] == "UNKNOWN":
msg = "{}, état de {} inconnu ({})".format(maintainer, host, text)
elif self.serviceData[host]["status_type"] == "CUSTOM":
msg = "{}, nouvelle notification de {} ({})".format(maintainer, host, text)
elif self.serviceData[host]["status_type"] == "RECOVERY":
msg = "{}, problème résolu sur {} ({})".format(maintainer, host, text)
self.linkedBot.push(destmuc, msg)
self.serviceData[host]["needUpdate"] = False
for service in self.serviceData[host]:
if not isinstance(self.serviceData[host][service], dict):
continue
if self.serviceData[host][service]["needUpdate"]:
destmuc = self.serviceData[host][service]["destmuc"]
text = self.serviceData[host][service]["text"]
msg = "(néant)"
if self.serviceData[host]["status_type"] == "PROBLEM" or
self.serviceData[host]["status_type"] == "UNKNOWN":
msg = "{}, je détecte de multiples problèmes sur {}".format(maintainer, host)
elif self.serviceData[host][service]["status_type"] == "PROBLEM":
msg = "{}, je détecte un problème de {} sur {} ({})".format(maintainer, service, host, text)
elif self.serviceData[host][service]["status_type"] == "UNKNOWN":
msg = "{}, état de {} inconnu pour {} ({})".format(maintainer, service, host, text)
elif self.serviceData[host][service]["status_type"] == "RECOVERY":
msg = "{}, problème de {} résolu sur {} ({})".format(maintainer, service, host, text)
self.linkedBot.push(destmuc, msg)
self.serviceData[host][service]["needUpdate"] = False
print("End of flush")
def push(self, msg):
# $notification.type$|$host.display_name$/$service.name$|$service.state$|$service.output$|$notification.author$|$notification.comment$
# EX: cominfra@salons.a-lec.org|CUSTOM|ctrlv.chalec.org/SSH server|CRITICAL|connect to address ctrlv.chalec.org and port 22: Connexion refusée|neox@a-lec.org|AGAIN
try:
# Get current time
curtime = datetime.datetime.now().strftime("%m/%d/%Y, %H:%M:%S")
# Get all params
destmuc, status_type, location, status_state, text, sender, comment = msg.split("|")
print("Dest: %s, Msg: %s" % (destmuc, msg))
print("Status: %s" % (status_type + " (" + status_state + ")"))
# check if message is about a service or host
if len(location.split("/")) > 1:
host, service = location.split("/")
else:
host = location
service = False
print("Host: %s, Service: %s" % (host, service))
print("Text: %s" % (text))
except Exception as e:
print("ERROR in serviceData.push():" + str(e))
return
# Is that host known
if host in self.serviceData:
# Is it a service and is it known
if service and service in self.serviceData[host]:
# update host if needed
self.serviceData[host][service]["status_state"] = status_state
self.serviceData[host][service]["status_type"] = status_type
self.serviceData[host][service]["destmuc"] = destmuc
self.serviceData[host][service]["text"] = text
maintainer = self.serviceData[host]["maintainer"]
if status_type != self.serviceData[host][service]["status_type"] and
status_type != self.serviceData[host]["status_type"]:
self.serviceData[host][service]["needUpdate"] = True
# Is it an unkown service
elif service:
# create zone for service
self.serviceData[host][service] = {}
self.serviceData[host][service]["destmuc"] = destmuc
self.serviceData[host][service]["status_state"] = status_state
self.serviceData[host][service]["status_type"] = status_type
self.serviceData[host][service]["text"] = text
maintainer = self.serviceData[host]["maintainer"]
if status_type != self.serviceData[host]["status_type"]:
self.serviceData[host][service]["needUpdate"] = True
# This is a host (not a service)
else:
# update host if needed
self.serviceData[host]["destmuc"] = destmuc
self.serviceData[host]["status_state"] = status_state
self.serviceData[host]["status_type"] = status_type
self.serviceData[host]["text"] = text
maintainer = self.serviceData[host]["maintainer"]
if status_type != self.serviceData[host]["status_type"]:
self.serviceData[host]["needUpdate"] = True
# That host is not known
else:
# create slot for host and service
if service:
self.serviceData[host] = {}
self.serviceData[host]["destmuc"] = None
self.serviceData[host]["status_state"] = None
self.serviceData[host]["status_type"] = None
self.serviceData[host]["text"] = None
self.serviceData[host]["maintainer"] = "Tout le monde"
self.serviceData[host]["needUpdate"] = False
self.serviceData[host][service] = {}
self.serviceData[host][service]["destmuc"] = destmuc
self.serviceData[host][service]["status_state"] = status_state
self.serviceData[host][service]["status_type"] = status_type
self.serviceData[host][service]["text"] = text
self.serviceData[host][service]["needUpdate"] = True
maintainer = self.serviceData[host]["maintainer"]
# create slot for host
else:
self.serviceData[host] = {}
self.serviceData[host]["destmuc"] = destmuc
self.serviceData[host]["status_state"] = status_state
self.serviceData[host]["status_type"] = status_type
self.serviceData[host]["text"] = text
self.serviceData[host]["maintainer"] = "Tout le monde"
self.serviceData[host]["needUpdate"] = True
maintainer = self.serviceData[host]["maintainer"]
# create maintainer in maintainer data if needed
if not maintainer in self.maintainerData:
self.maintainerData[maintainer] = {}
# create host entry
if not service:
service = "GENERAL"
if not host in self.maintainerData[maintainer]:
self.maintainerData[maintainer][host] = []
self.maintainerData[maintainer][host].append(
"%s [%s]: %s %s (%s %s)" % (curtime, status_state, service, text, sender, comment)
)
print(self.serviceData)
print("Flushing...")
self.flush()
print(self.serviceData)
print("End of push")