isengard-bot/sharedBuffer.py

168 lines
6.6 KiB
Python

class SharedBuffer:
def __init__(self, linkedBot):
self.buf = {}
self.linkedBot = linkedBot
def flush(self):
for host in self.buf:
if not isinstance(self.buf[host], dict):
continue
maintainer = self.buf[host]["maintainer"]
if self.buf[host]["needUpdate"]:
destmuc = self.buf[host]["destmuc"]
text = self.buf[host]["text"]
msg = "(néant)"
if self.buf[host]["status_type"] == "PROBLEM":
msg = "{}, je détecte un problème sur {} ({})".format(maintainer, host, text)
elif self.buf[host]["status_type"] == "UNKNOWN":
msg = "{}, état de {} inconnu ({})".format(maintainer, host, text)
elif self.buf[host]["status_type"] == "RECOVERY":
msg = "{}, problème résolu sur {} ({})".format(maintainer, host, text)
self.linkedBot.send_message(
mto=destmuc,
mbody=msg,
mtype='groupchat')
self.buf[host]["needUpdate"] = False
print("Sent to {}, msg: {}".format(destmuc, msg))
for service in self.buf[host]:
if not isinstance(self.buf[host][service], dict):
continue
if self.buf[host][service]["needUpdate"]:
destmuc = self.buf[host][service]["destmuc"]
text = self.buf[host][service]["text"]
msg = "(néant)"
if self.buf[host][service]["status_type"] == "PROBLEM":
msg = "{}, je détecte un problème de {} sur {} ({})".format(maintainer, service, host, text)
elif self.buf[host][service]["status_type"] == "UNKNOWN":
msg = "{}, état de {} inconnu pour {} ({})".format(maintainer, service, host, text)
elif self.buf[host][service]["status_type"] == "RECOVERY":
msg = "{}, problème de {} résolu sur {} ({})".format(maintainer, service, host, text)
self.linkedBot.send_message(
mto=destmuc,
mbody=msg,
mtype='groupchat')
self.buf[host][service]["needUpdate"] = False
print("Sent to {}, msg: {}".format(destmuc, msg))
print("End of flush")
def push(self, msg):
# separate dest and message
destmuc, rmsg = msg.split("|")
# separate and parse lines
cutmsg_l0 = rmsg.split("\n")[0].split(" ")
cutmsg_l1 = rmsg.split("\n")[1].split("-")
# get the status of location
status_type = cutmsg_l0[0].replace(" ", "")
status_state = cutmsg_l0[-1].replace(" ", "")
# get the location
location = ""
for i in range(len(cutmsg_l0) - 2):
location += cutmsg_l0[i+1] + " "
location = location[:-1]
# check if message is about a service or host
if len(location.split("/")) > 1:
host, service = location.split("/")
else:
host = location
service = False
text = status_state + ": " + cutmsg_l1[1].split("(")[0][1:]
raw = rmsg.split("\n")[1]
print("Dest: %s, Msg: %s" % (destmuc, rmsg))
print("Status: %s" % (status_type + " (" + status_state + ")"))
print("Host: %s, Service: %s" % (host, service))
print("Text: %s" % (text))
if host in self.buf:
if service and service in self.buf[host]:
if status_state != self.buf[host][service]["status_state"] \
or status_type != self.buf[host][service]["status_type"]:
self.buf[host][service]["status_state"] = status_state
self.buf[host][service]["status_type"] = status_type
self.buf[host][service]["destmuc"] = destmuc
self.buf[host][service]["text"] = text
self.buf[host][service]["raw"] = raw
self.buf[host][service]["needUpdate"] = True
else:
# exit if problem resolved (but unkown in the first place)
if status_type == "RECOVERY":
return
# create zone for service
self.buf[host][service] = {}
self.buf[host][service]["destmuc"] = destmuc
self.buf[host][service]["status_state"] = status_state
self.buf[host][service]["status_type"] = status_type
self.buf[host][service]["text"] = text
self.buf[host][service]["raw"] = raw
self.buf[host][service]["needUpdate"] = True
else:
# exit if problem resolved (but unkown in the first place)
if status_type == "RECOVERY":
return
# create zone for service
if service:
self.buf[host] = {}
self.buf[host]["destmuc"] = None
self.buf[host]["status_state"] = None
self.buf[host]["status_type"] = None
self.buf[host]["text"] = None
self.buf[host]["raw"] = None
self.buf[host]["maintainer"] = None
self.buf[host]["needUpdate"] = False
self.buf[host][service] = {}
self.buf[host][service]["destmuc"] = destmuc
self.buf[host][service]["status_state"] = status_state
self.buf[host][service]["status_type"] = status_type
self.buf[host][service]["text"] = text
self.buf[host][service]["raw"] = raw
self.buf[host][service]["needUpdate"] = True
else:
self.buf[host] = {}
self.buf[host]["destmuc"] = destmuc
self.buf[host]["status_state"] = status_state
self.buf[host]["status_type"] = status_type
self.buf[host]["text"] = text
self.buf[host]["raw"] = raw
self.buf[host]["maintainer"] = None
self.buf[host]["needUpdate"] = True
print(self.buf)
print("Sending...")
self.flush()
print("Sent.")
print(self.buf)
print("End of push")
#PROBLEM video.chalec.org/System load CRITICAL
#CRITICAL - Charge moyenne: 6.45, 5.61, 4.12 (Commentaire: [] )