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: [] )