Advertisement
s243a

loggerContainer - rest_test6.py

Nov 14th, 2018
285
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.59 KB | None | 0 0
  1. class loggerContainer:
  2.     def __init__(self,node=None,**kw):
  3.         self.ready = False
  4.         self.strBuff = StringIO.StringIO()
  5.         self.job = kw.get('job',None)
  6.         self.Brk = kw.get('Brk',"\n")
  7.         self.body = kw.get('body',None) #The html body to write to.
  8.  
  9.         self.msgDict={}
  10.         self.meseges=[None]*5
  11.         self.msgPosNext=0
  12.         self.msgPos=-1
  13.         self.msgMax=5
  14.         self.msgLnCnt=0  
  15.         self.cb = kw.get('cb',None) #A callback function for self.logfunc
  16.         self.node=kw.get('node',None)
  17.         self.dealayDuringFetch=7
  18.         self.delayWhenFishished=100
  19.         self.complete=False        
  20.         self.EndHdr=False
  21.        
  22.     def do_logfunc(self,msgline):
  23.         #print("self.msgPosNext="+str(self.msgPosNext))
  24.        
  25.         self.meseges[self.msgPosNext]={ "msg_str" : msgline,
  26.                                         "time" : datetime.now()
  27.                                       }      
  28.         self.msgPos=self.msgPosNext
  29.         #print("self.msgMax="+str(self.msgMax))
  30.         self.msgPosNext=((self.msgPosNext+1)%(self.msgMax))
  31.         if self.filterMSG(msgline):
  32.             self.msgDict[msgline]=datetime.now()
  33.         if self.msgLnCnt<self.msgMax:
  34.             self.msgLnCnt=self.msgLnCnt+1        
  35.     def logfunc(self,msgline,**kw):
  36.         #print(msgline)
  37.         mDict=self.parseMsg(msgline)
  38.         #cb=None,HTML_lb="<br>"
  39.         #if cb is None:
  40.         #    cb=lambda msg: self.print_and_put_cb(msg,HTML_lb="<br>",chkSender=True)
  41.    
  42.         if self.cb is None:
  43.             #print(msgline)
  44.             self.print_and_put_cb(msgline,mDict)
  45.         else:
  46.             cb(msgline,mDict)
  47.         self.do_logfunc(msgline)            
  48.     def parseMsg(self,msg):
  49.         mDict=self.parseSenderLine(msg)
  50.         sender=mDict.get('sender',None)
  51.         if (sender == 'CLIENT') or (sender == 'CLIENT'):
  52.             mDict['node_or_client']=True
  53.             try: #Not sure if we need a try/except here
  54.                 #k, v = mgStrToKey(mDict['msg_str'])
  55.                 #mDict['k']=v
  56.                 mDict=self.parseFCPMsgStr(mDict['msg_str']) # I haven't decided if a dictionary should be returned or a seperate key/value
  57.             except:
  58.                 pass
  59.         return mDict    
  60.     def parseSenderLine(self,msg_line):
  61.        regex=r'^(?P<sender>\S+)[:]\s+(?P<msg_str>[^\n]+)\n{0,1}$'
  62.        try: #Not sure if we need a try/except here
  63.            #print msg_line
  64.            m=re.match(regex,msg_line)
  65.            mDict=m.groupdict()
  66.            assert len(mDict['msg_str'])>0 #,"Could not parse msg_str"
  67.            self.setStatus(mDict['msg_str']) #This is to detect the end of communications
  68.        except AssertionError:
  69.            print("Could not parse msg_str")
  70.            print("msg_line="+msg_line)
  71.            return mDict
  72.        if mDict is None:
  73.            mDict={'sender' : 'Unknown',
  74.                  'msg_str' : msg_line }
  75.        return mDict
  76.     def parseFCPMsgStr(self,msg_line): #I should think of a better name for this
  77.         mDict, succeeded = self.parseSenderLine(msg_line)
  78.         if succeeded:
  79.             k, v, hasKeyVal = line.split("=", 1)
  80.             if hasKeyVal:
  81.                 mDict['parsed'][k]=v
  82.             else:
  83.                 mDict['parsed'][mDict['msg_str']]=True #Maybe do some checks here such as length and for white space characters
  84.         return mDict, succeeded
  85.     def print_and_put_cb(self,msg,mDict):
  86.         node_or_client=mDict.get('node_or_client',False)
  87.         #chkSender= not node_or_client
  88.         if self.filterMSG(msg): #Don't reprint the same message if we've scene it recently.
  89.             print self.msg_to_str(msg)
  90.         if node_or_client:
  91.             self.bodyPut_cb(msg,chkSender=False)
  92.     def filterMSG(self,msg): #We don't want to see the same log message too often
  93.         t1=self.msgDict.get(msg,None)
  94.        
  95.         if t1 is not None: #isinstance(t1,datetime):
  96.             if self.isComplete():
  97.                 delay=self.delayWhenFishished=100
  98.             else:
  99.                 delay=self.dealayDuringFetch=7
  100.             t2=datetime.now()
  101.             delta = t2 - t1 #https://stackoverflow.com/questions/2880713/time-difference-in-seconds-as-a-floating-point
  102.             #print(str(delta.seconds)+" "+msg)            
  103.             if delta.seconds>delay:
  104.                 return True
  105.             else:
  106.                 return False
  107.         else:
  108.             #print("New Message"+msg)
  109.             return True
  110.     def bodyPut_cb(self,msg,HTML_lb="<br>",chkSender=True):
  111.         #parseMsg
  112.         if chkSender:
  113.             if self.filterForBody(msg):
  114.                 print('bodyPut_cb: This branch should not normally be called')
  115.                 self.body.put(self.msg_to_str(msg)+HTML_lb)
  116.         else:
  117.             self.body.put(self.msg_to_str(msg)+HTML_lb)
  118.            
  119.     def filterForBody(self,msg):
  120.         if msg.startswith("NODE:") or msg.startswith("CLIENT:"):
  121.             return True
  122.         else:
  123.             return False
  124.  
  125.     def msg_to_str(self,msg):
  126.         if type(msg) == str:
  127.             return msg
  128.         elif type(msg) is dict: #isinstance(msg, collections.Mapping): #https://stackoverflow.com/questions/25231989/how-to-check-if-a-variable-is-a-dictionary-in-python
  129.             return msg['msg_str']
  130.         else:
  131.             return "Empty Message"
  132.     def tail(self,lines=0,cb=None,delta=None):
  133.         if cb is None:
  134.             cb=self.print_and_put_cb
  135.         if lines == 0:
  136.             N=self.msgMax
  137.         else:
  138.             N=min(self.msgMax,lines)
  139.         for i in range(self.msgPost,self.msgPos-N+1,-1):
  140.             msg_i=self.meseges[i%self.msgMax]
  141.             if delta is not None:
  142.                 t2=datetime.now()
  143.                 t1=msg_i['time']
  144.                 delta2=t2-t1
  145.                 if delta2.delta.microseconds > delta.microseconds:
  146.                     break
  147.             cb(self.meseges[i%self.msgMax])
  148.                  
  149.         #self.body.put(msgline)  
  150.     def myLogger(self, level, msg):
  151.         print("level="+level + " msg=" + msg)
  152.         if level > self.job.verbosity:
  153.             return  
  154.         if not msg.endswith(self.Brk):
  155.             msg += "\n"
  156.        
  157.         strBuff.write(msg)
  158.         self.isReady = True
  159.         #strBuff.flush()
  160.         #time.sleep(0.001)
  161.     def getLogger(self): #THis might be redundant
  162.         return self.myLogger              
  163.     def isReady(self):
  164.         return self.ready
  165.     def flush(self):
  166.         val=self.strBuff.getvalue()
  167.         self.strBuff.close()
  168.         self.strBuff = StringIO.StringIO()
  169.         self.isRead=False
  170.         return val
  171.     def getValue(self):
  172.         self.strBuff.getValue()
  173.     def readBuf(self):
  174.         if self.ready:
  175.             val = self.flush()
  176.             ready = True
  177.             return val, ready
  178.         else:
  179.             ready = False
  180.             val = ""
  181.             return val, ready
  182.         return val, ready
  183.     def isComplete(self): # We might also want to check for an EndMessage and wait if needed
  184.         return self.complete
  185.         #if self.job.msg['hdr'] == 'PutSuccessful':
  186.         #    return True
  187.         #elif self.job.msg['hdr'] == 'PutFailed':
  188.         #    return True
  189.     def detectEndMsg(self,msg): #I don't think we use this
  190.        
  191.         if filterForBody(self,msg):
  192.             node_or_client = True
  193.         else:
  194.             node_or_client = False
  195.         return node_or_client
  196.     def setStatus(self,msgLine):
  197.         if msgLine == 'PutSuccessful':
  198.             self.EndHdr=True
  199.         elif msgLine == 'PutFailed':
  200.             self.EndHdr=True
  201.         if self.EndHdr==True:
  202.             if msgLine=='EndMessage':
  203.                 self.complete=True
  204.     def callback(self, status, value):
  205.         if status == 'PutSuccessful':
  206.             self.complete=True
  207.         elif status == 'PutFailed':
  208.             self.complete=True
  209.         #elif status == 'URIGenerated':
  210.         #    self.complete=True        
  211.         #self.msg=value
  212.     def getCallback(self):
  213.         return self.callback    
  214.  
  215.     print "Inserting %s, containing '%s'" % (uri, val)
  216.    
  217.     body = queue.Queue()    
  218.     lgrCnt=loggerContainer(body=body)    
  219.  
  220.     node = fcp.FCPNode(host=fcpHost,verbosity=fcp.NOISY,port=fcpPort,logfunc=lgrCnt.logfunc)    
  221.  
  222.     loggerContainer.node=node # We don't use this yet    
  223.  
  224.     aStartCB = lambda: node.put(uri, data=val, async=True)  #Can I start a thread with a lambda expression?      
  225.     worker = FreeWorkerFactory(loggerContainer=lgrCnt,startCB=aStartCB,body=body)
  226.  
  227.    
  228.    
  229.     body, g = worker.start() #Returns the greenelet
  230.  
  231.     return body
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement