Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-04-10 08:38:58

0001 import re
0002 
0003 from pandacommon.pandalogger.PandaLogger import PandaLogger
0004 from pandacommon.pandautils.PandaUtils import naive_utcnow
0005 
0006 from pandajedi.jediconfig import jedi_config
0007 from pandaserver.userinterface import Client
0008 
0009 
0010 class MsgWrapper:
0011     def __init__(self, logger, token=None, lineLimit=500, monToken=None):
0012         self.logger = logger
0013         # use timestamp as token if undefined
0014         if token is None:
0015             self.token = f"<{naive_utcnow().isoformat('/')}>"
0016         else:
0017             self.token = token
0018         # token for http logger
0019         if monToken is None:
0020             self.monToken = self.token
0021         else:
0022             self.monToken = monToken
0023         # remove <> for django
0024         try:
0025             self.monToken = re.sub("<(?P<name>[^>]+)>", "\g<name>", self.monToken)
0026         except Exception:
0027             pass
0028         # message buffer
0029         self.msgBuffer = []
0030         self.bareMsg = []
0031         self.lineLimit = lineLimit
0032         self.message_slot = None
0033 
0034     def keepMsg(self, msg):
0035         # check if message slot is defined and available
0036         if self.message_slot is not None:
0037             if self.message_slot < 0:
0038                 return
0039             if self.message_slot == 0:
0040                 msg = "   ..."
0041             self.message_slot -= 1
0042         # keep max message depth
0043         if len(self.msgBuffer) > self.lineLimit:
0044             self.msgBuffer.pop(0)
0045             self.bareMsg.pop(0)
0046         timeNow = naive_utcnow()
0047         self.msgBuffer.append(f"{timeNow.isoformat(' ')} : {msg}")
0048         self.bareMsg.append(msg)
0049 
0050     def set_message_slot(self, slot: int = 10):
0051         self.message_slot = slot
0052 
0053     def unset_message_slot(self):
0054         self.message_slot = None
0055 
0056     def info(self, msg):
0057         msg = str(msg)
0058         self.logger.info(self.token + " " + msg)
0059         self.keepMsg(msg)
0060 
0061     def debug(self, msg):
0062         msg = str(msg)
0063         self.logger.debug(self.token + " " + msg)
0064 
0065     def error(self, msg):
0066         msg = str(msg)
0067         self.logger.error(self.token + " " + msg)
0068         self.keepMsg(msg)
0069 
0070     def warning(self, msg):
0071         msg = str(msg)
0072         self.logger.warning(self.token + " " + msg)
0073         self.keepMsg(msg)
0074 
0075     def dumpToString(self):
0076         strMsg = ""
0077         for msg in self.msgBuffer:
0078             strMsg += msg
0079             strMsg += "\n"
0080         return strMsg
0081 
0082     def uploadLog(self, id):
0083         strMsg = self.dumpToString()
0084         s, o = Client.uploadLog(strMsg, id)
0085         if s != 0:
0086             return f"failed to upload log with {s} {o}."
0087 
0088         success = o["success"]
0089         message = o["message"]
0090         url = o["data"]
0091 
0092         if success and url.startswith("http"):
0093             return f"<a href=\"{url}\">log</a> : {'. '.join(self.bareMsg[-2:])}."
0094 
0095         return message
0096 
0097     # send message to logger
0098     def sendMsg(self, message, msgType, msgLevel="info", escapeChar=False):
0099         try:
0100             # get logger
0101             tmpPandaLogger = PandaLogger()
0102             # lock HTTP handler
0103             tmpPandaLogger.lock()
0104             tmpPandaLogger.setParams({"Type": msgType})
0105             # get logger
0106             tmpLogger = tmpPandaLogger.getHttpLogger(jedi_config.master.loggername)
0107             # escape special characters
0108             if escapeChar:
0109                 message = message.replace("<", "&lt;")
0110                 message = message.replace(">", "&gt;")
0111             # add message
0112             message = self.monToken + " " + message
0113             if msgLevel == "error":
0114                 tmpLogger.error(message)
0115             elif msgLevel == "warning":
0116                 tmpLogger.warning(message)
0117             elif msgLevel == "info":
0118                 tmpLogger.info(message)
0119             else:
0120                 tmpLogger.debug(message)
0121             # release HTTP handler
0122             tmpPandaLogger.release()
0123         except Exception:
0124             pass