184 lines
8.3 KiB
Python
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")
|