def _respond(self, transaction): mgmt = self.session().value('mgmt') assert 'monitor' != mgmt.remoteUser.lower(), \ 'Monitor may not view or download logs.' # check permissions assert Nodes.permission(mgmt, '/logging/syslog/action/file/\/var\/log\/messages') != 'deny', \ ('%s may not view or download logs.' % mgmt.remoteUser) request = transaction.request() response = transaction.response() fields = request.fields() logtype = fields.get('logtype', 'user') mime = fields.get('mime', '') or self.ContentType logfilename = '/var/log/%smessages' % self.LOGTYPE_PREFIX[logtype] try: bytesize = os.stat(logfilename)[stat.ST_SIZE] seekto = max(0, bytesize - 500) response.setHeader('Content-type', mime) response.commit() if mime.endswith('html'): response.write('<html>\n') response.write('<head>\n') response.write('<title>Continuous Log</title>\n') response.write('</head>\n') response.write('<body>\n') response.write('<pre>\n') response.flush(True) logfile = file(logfilename) logfile.seek(seekto) # Seek to almost EOF # Print out the last few lines of the log, # stripping out any partial line artifact of our seek() txt = cgi.escape(logfile.read() or '') txt = txt[txt.find('\n') + 1:] writingDots = 0 # Write to log after seek so we should read it in the first # iteration of reading logfile. while hasattr(request, '_transaction') and \ 2 < AppServerModule.globalAppServer._running: if txt: if writingDots: response.write('\n') writingDots = 0 response.write(txt) else: writingDots += 1 if 0 == writingDots % 80: response.write('\n') response.write('. ') time.sleep(3) response.flush() # I don't trust auto flush txt = cgi.escape(logfile.read() or '') except ConnectionAbortedError: pass except: OSUtils.logException()
def _openPathname(self, pathName): # check permissions mgmt = self.session().value('mgmt') assert 'monitor' != mgmt.remoteUser.lower(), \ 'Download prohibited for the monitor user.' assert Nodes.permission( mgmt, self.__getTarget()['rbaNode']) != 'deny', \ ('Download prohibited for user %s.' % mgmt.remoteUser) if 'openFileFn' in self.__getTarget(): return self.__getTarget()['openFileFn'](pathName) else: return file(pathName, "r")