def writeInfoItems(self, file): wr = self.writeInfoItem wr(file, 'Date', asclocaltime()) wr(file, 'Python ver', sys.version) wr(file, 'Op Sys', os.name) wr(file, 'Platform', sys.platform) wr(file, 'Cur dir', os.getcwd())
def logExceptionToDisk(self, errorMsgFilename=None): """Log the exception to disk. Writes a tuple containing (date-time, filename, pathname, exception-name, exception-data,error report filename) to the errors file (typically 'Errors.csv') in CSV format. Invoked by `handleException`. """ if not self.setting('LogErrors'): return err, msg = self._exc[:2] err, msg = err.__name__, str(msg) logline = (asclocaltime(self._time), self.basicServletName(), self.servletPathname(), err, msg, errorMsgFilename or '') def fixElement(element): element = str(element) if ',' in element or '"' in element: element = element.replace('"', '""') element = '"%s"' % element return element logline = map(fixElement, logline) filename = self._app.serverSidePath(self.setting('ErrorLogFilename')) if os.path.exists(filename): f = open(filename, 'a') else: f = open(filename, 'w') f.write('time,filename,pathname,exception name,' 'exception data,error report filename\n') f.write(','.join(logline) + '\n') f.close()
def willWriteCreateSQL(self, generator, out): # @@ 2001-02-04 ce: break up this method wr = out.write kv = self.writeKeyValue wr('/*\nStart of generated SQL.\n\n') kv(out, 'Date', asclocaltime()) kv(out, 'Python ver', sys.version) kv(out, 'Op Sys', os.name) kv(out, 'Platform', sys.platform) kv(out, 'Cur dir', os.getcwd()) kv(out, 'Num classes', len(self._klasses)) wr('\nClasses:\n') for klass in self._model.allKlassesInOrder(): wr(' %s\n' % klass.name()) wr('*/\n\n') sql = generator.setting('PreSQL', None) if sql: wr('/* PreSQL start */\n' + sql + '\n/* PreSQL end */\n\n') dbName = generator.sqlDatabaseName() drop = generator.setting('DropStatements') if drop == 'database': wr(self.dropDatabaseSQL(dbName)) wr(self.createDatabaseSQL(dbName)) wr(self.useDatabaseSQL(dbName)) elif drop == 'tables': wr(self.useDatabaseSQL(dbName)) wr(self.dropTablesSQL()) else: raise ValueError('Invalid value for DropStatements setting: %r' % drop)
def logExceptionToDisk(self, errorMsgFilename=None): """Log the exception to disk. Writes a tuple containing (date-time, filename, pathname, exception-name, exception-data,error report filename) to the errors file (typically 'Errors.csv') in CSV format. Invoked by `handleException`. """ if not self.setting('LogErrors'): return err, msg = self._exc[:2] if isinstance(err, basestring): # string exception err, msg = '', str(msg or err) else: err, msg = err.__name__, str(msg) logline = (asclocaltime(self._time), self.basicServletName(), self.servletPathname(), err, msg, errorMsgFilename or '') def fixElement(element): element = str(element) if ',' in element or '"' in element: element = element.replace('"', '""') element = '"%s"' % element return element logline = map(fixElement, logline) filename = self._app.serverSidePath(self.setting('ErrorLogFilename')) if os.path.exists(filename): f = open(filename, 'a') else: f = open(filename, 'w') f.write('time,filename,pathname,exception name,' 'exception data,error report filename\n') f.write(','.join(logline) + '\n') f.close()
def log(self, message): """Log a message. This can be invoked to print messages concerning the servlet. This is often used by self to relay important information back to developers. """ print '[%s] [msg] %s' % (asclocaltime(), message)
def generatePNGImage(self): """Generate and return a PNG example image.""" def f(x): return x, sin(x) draw = Drawing() draw.text((2.7, 0.8), 'y=sin(x)', black) draw.text((0.2, -0.8), 'created: ' + asclocaltime(), red) draw.lines(((0, 0), (2*pi, 0)), black) # x-axis draw.lines(((0, -1), (0, 1)), black) # y-axis draw.lines(map(f, map(lambda x: x*2*pi/X, xrange(X+1))), blue) return draw.png()
def logExceptionToConsole(self, stderr=None): """Log an exception. Logs the time, servlet name and traceback to the console (typically stderr). This usually results in the information appearing in console/terminal from which AppServer was launched. """ if stderr is None: stderr = sys.stderr stderr.write('[%s] [error] WebKit: Error while executing script %s\n' % (asclocaltime(self._time), self.servletPathname())) traceback.print_exc(file=stderr)
def generatePNGImage(self): """Generate and return a PNG example image.""" def f(x): return x, sin(x) draw = Drawing() draw.text((2.7, 0.8), 'y=sin(x)', black) draw.text((0.2, -0.8), 'created: ' + asclocaltime(), red) draw.lines(((0, 0), (2 * pi, 0)), black) # x-axis draw.lines(((0, -1), (0, 1)), black) # y-axis draw.lines(map(f, map(lambda x: x * 2 * pi / X, xrange(X + 1))), blue) return draw.png()
def printStartUpMessage(self): """Invoked by __init__, prints a little intro.""" print 'WebKit AppServer', self.version() print 'Part of Webware for Python.' print 'Copyright 1999-2010 by Chuck Esterbrook. All Rights Reserved.' print 'WebKit and Webware are open source.' print print 'Process id is', os.getpid() print 'Date/time is', asclocaltime() print 'Python is', sys.version.replace(') [', ')\n[') print if self.setting('PrintConfigAtStartUp'): self.printConfig()
def printStartUpMessage(self): """Print a little intro to the activity log.""" print('Webware for Python', self.webwareVersionString(), 'Application') print() print('Process id:', os.getpid()) print('Start date/time:', asclocaltime()) print('Python:', sys.version) print() if self.development(): print("Running in development mode") print() if self.setting('PrintConfigAtStartUp'): self.printConfig()
def writeMiscInfo(self): """Output misc info. Write a couple little pieces of information about the environment. """ self.writeTitle('MiscInfo') info = { 'time': asclocaltime(self._time), 'filename': self.servletPathname(), 'os.getcwd()': os.getcwd(), 'sys.path': sys.path, 'sys.version': sys.version, } self.writeDict(info)
def printStartUpMessage(self): """Invoked by __init__, prints a little intro.""" print "WebKit AppServer", self.version() print "Part of Webware for Python." print "Copyright 1999-2010 by Chuck Esterbrook. All Rights Reserved." print "WebKit and Webware are open source." print "Please visit: http://www.webwareforpython.org" print print "Process id is", os.getpid() print "Date/time is", asclocaltime() print "Python is", sys.version.replace(") [", ")\n[") print if self.setting("PrintConfigAtStartUp"): self.printConfig()
def saveErrorPage(self, html): """Save the error page. Saves the given HTML error page for later viewing by the developer, and returns the filename used. """ filename = os.path.join(self._app._errorMessagesDir, self.errorPageFilename()) try: with open(filename, 'w') as f: f.write(html) except IOError: sys.stderr.write('[%s] [error] WebKit: Cannot save error page (%s)\n' % (asclocaltime(self._time), filename)) else: return filename
def shutDown(signum, frame): """Signal handler for shutting down the server.""" print print "App server has been signaled to shutdown." if server and server._running > 2: print "Shutting down at", asclocaltime() sys.stdout.flush() server._running = 2 if signum == SIGINT: raise KeyboardInterrupt elif signum == SIGHUP: sys.exit(3) # force reload else: sys.exit(0) # normal exit else: print "No running app server was found."
def saveErrorPage(self, html): """Save the error page. Saves the given HTML error page for later viewing by the developer, and returns the filename used. """ filename = os.path.join(self._app._errorMessagesDir, self.errorPageFilename()) try: with open(filename, 'w') as f: f.write(html) except IOError: sys.stderr.write( '[%s] [error] WebKit: Cannot save error page (%s)\n' % (asclocaltime(self._time), filename)) else: return filename
def threadDump(signum, frame): """Signal handler for dumping thread stack frames to stdout.""" print print "App server has been signaled to attempt a thread dump." print print "Thread stack frame dump at", asclocaltime() sys.stdout.flush() frames = sys._current_frames() print print "-" * 79 print for threadID in sorted(frames): frame = frames[threadID] print "Thread ID: %d (reference count = %d)" % ( threadID, sys.getrefcount(frame)) print ''.join(traceback.format_list(traceback.extract_stack(frame))) print "-" * 79 sys.stdout.flush()
def willWriteSQL(self, generator, out): wr = out.write kv = self.writeKeyValue wr('/*\nStart of generated SQL.\n\n') kv(out, 'Date', asclocaltime()) kv(out, 'Python ver', sys.version) kv(out, 'Op Sys', os.name) kv(out, 'Platform', sys.platform) kv(out, 'Cur dir', os.getcwd()) kv(out, 'Num classes', len(self._klasses)) wr('\nClasses:\n') for klass in self._klasses: wr(' %s\n' % klass.name()) wr('*/\n\n') sql = generator.setting('PreSQL', None) if sql: wr('/* PreSQL start */\n' + sql + '\n/* PreSQL end */\n\n') # If database doesn't exist create it. dbName = generator.dbName()
def willWriteSQL(self, generator, out): wr = out.write kv = self.writeKeyValue wr("/*\nStart of generated SQL.\n\n") kv(out, "Date", asclocaltime()) kv(out, "Python ver", sys.version) kv(out, "Op Sys", os.name) kv(out, "Platform", sys.platform) kv(out, "Cur dir", os.getcwd()) kv(out, "Num classes", len(self._klasses)) wr("\nClasses:\n") for klass in self._klasses: wr(" %s\n" % klass.name()) wr("*/\n\n") sql = generator.setting("PreSQL", None) if sql: wr("/* PreSQL start */\n" + sql + "\n/* PreSQL end */\n\n") # If database doesn't exist create it. dbName = generator.dbName()
def logExceptionToDisk(self, errorMsgFilename=None): """Log the exception to disk. Writes a tuple containing (date-time, filename, pathname, exception-name, exception-data, error report filename) to the errors file (typically 'Errors.csv') in CSV format. Invoked by `handleException`. """ if not self.setting('LogErrors'): return err, msg = self._exc[:2] err, msg = err.__name__, str(msg) logLine = ( asclocaltime(self._time), self.basicServletName(), self.servletPathname(), err, msg, errorMsgFilename or '') def fixElement(element): element = str(element) if ',' in element or '"' in element: element = element.replace('"', '""') element = f'"{element}"' return element logLine = ','.join(map(fixElement, logLine)) + '\n' filename = self._app.setting('ErrorLogFilename') try: if os.path.exists(filename): with open(filename, 'a') as f: f.write(logLine) else: with open(filename, 'w') as f: f.write( 'time,filename,pathname,exception name,' 'exception data,error report filename\n') f.write(logLine) except Exception as e: print('Could not write to error log:', e)
def emailException(self, htmlErrMsg): """Email the exception. Send the exception via mail, either as an attachment, or as the body of the mail. """ message = Message() # Construct the message headers headers = self.setting('ErrorEmailHeaders').copy() headers['Date'] = formatdate() headers['Mime-Version'] = '1.0' headers['Subject'] = '{} {}: {}'.format( headers.get('Subject', '[Webware Error]'), *sys.exc_info()[:2]) for header, value in headers.items(): if isinstance(value, (list, tuple)): value = ','.join(value) message.add_header(header, value) # Construct the message body if self.setting('EmailErrorReportAsAttachment'): # start off with a text/plain part text = self._emailBody.format(path=self.servletPathname(), ascTime=asclocaltime(self._time), time=self._time) message.set_type('multipart/mixed') part = Message() part.set_type('text/plain') body = StringIO() body.write(text) traceback.print_exc(file=body) part.set_payload(body.getvalue()) body.close() message.attach(part) part = Message() # now add htmlErrMsg part.add_header('Content-Transfer-Encoding', '7bit') part.add_header('Content-Description', 'HTML version of Webware error message') part.add_header('Content-Disposition', 'attachment', filename='WebwareErrorMsg.html') part.set_type('text/html') part.set_payload(htmlErrMsg) message.attach(part) else: message.set_type('text/html') message.set_payload(htmlErrMsg, 'us-ascii') # Send the message server = self.setting('ErrorEmailServer') # This setting can be: server, server:port, server:port:user:password # or server:port:user:password:popserver:popport for "smtp after pop". parts = server.split(':', 5) server = port = user = passwd = None popserver = popssl = popport = None try: # fetch individual parts until we get an IndexError server = parts[0] try: port = int(parts[1]) except ValueError: pass user = parts[2] passwd = parts[3] popserver = parts[4] try: popport = int(parts[5]) except ValueError: popport = None if parts[6].lower() == 'ssl': popssl = True except IndexError: pass if user and passwd and popserver: # SMTP after POP if popssl is None and popport == 995: popssl = True popssl = poplib.POP3_SSL if popssl else poplib.POP3 if popport: popserver = popssl(popserver, popport) else: popserver = popssl(popserver) popserver.set_debuglevel(0) popserver.user(user) popserver.pass_(passwd) try: popserver.quit() except Exception: pass if port: server = smtplib.SMTP(server, port) else: server = smtplib.SMTP(server) try: server.set_debuglevel(0) if user and passwd and not popserver: # SMTP-AUTH server.ehlo() if server.has_extn('starttls'): server.starttls() server.ehlo() server.login(user, passwd) body = message.as_string() server.sendmail(headers['From'], headers['To'], body) finally: try: server.quit() except Exception: pass
def timeStamp(self): """Return time() as a human readable string, useful for logging and debugging.""" return asclocaltime(self.time())
def shutDown(arg1, arg2): print "Shutdown Called", asclocaltime() if server: server.initiateShutdown() else: print 'WARNING: No server reference to shutdown.'
def emailException(self, htmlErrMsg): """Email the exception. Send the exception via mail, either as an attachment, or as the body of the mail. """ message = Message() # Construct the message headers headers = self.setting('ErrorEmailHeaders').copy() headers['Date'] = formatdate() headers['Mime-Version'] = '1.0' headers['Subject'] = headers.get('Subject', '[WebKit Error]') + ' %s: %s' % sys.exc_info()[:2] for h, v in headers.items(): if isinstance(v, (list, tuple)): v = ','.join(v) message.add_header(h, v) # Construct the message body if self.setting('EmailErrorReportAsAttachment'): # start off with a text/plain part text = ('WebKit caught an exception while processing' ' a request for "%s" at %s (timestamp: %s).' ' The plain text traceback from Python is printed below and' ' the full HTML error report from WebKit is attached.\n\n' % (self.servletPathname(), asclocaltime(self._time), self._time)) message.set_type('multipart/mixed') part = Message() part.set_type('text/plain') body = StringIO() body.write(text) traceback.print_exc(file=body) part.set_payload(body.getvalue()) body.close() message.attach(part) part = Message() # now add htmlErrMsg part.add_header('Content-Transfer-Encoding', '7bit') part.add_header('Content-Description', 'HTML version of WebKit error message') part.add_header('Content-Disposition', 'attachment', filename='WebKitErrorMsg.html') part.set_type('text/html') part.set_payload(htmlErrMsg) message.attach(part) else: message.set_type('text/html') message.set_payload(htmlErrMsg, 'us-ascii') # Send the message server = self.setting('ErrorEmailServer') # This setting can be: server, server:port, server:port:user:password # or server:port:user:password:popserver:popport for "smtp after pop". parts = server.split(':', 5) server = port = user = passwd = None popserver = popssl = popport = None try: server = parts[0] try: port = int(parts[1]) except ValueError: pass user = parts[2] passwd = parts[3] popserver = parts[4] try: popport = int(parts[5]) except ValueError: popport = None if parts[6].lower() == 'ssl': popssl = True except IndexError: pass if user and passwd and popserver: # SMTP after POP if popssl is None and popport == 995: popssl = True popssl = popssl and poplib.POP3_SSL or poplib.POP3 if popport: popserver = popssl(popserver, popport) else: popserver = popssl(popserver) popserver.set_debuglevel(0) popserver.user(user) popserver.pass_(passwd) try: popserver.quit() except Exception: pass if port: server = smtplib.SMTP(server, port) else: server = smtplib.SMTP(server) try: server.set_debuglevel(0) if user and passwd and not popserver: # SMTP-AUTH server.ehlo() if server.has_extn('starttls'): server.starttls() server.ehlo() server.login(user, passwd) body = message.as_string() server.sendmail(headers['From'], headers['To'], body) finally: try: server.quit() except Exception: pass
def writeContent(self): self.write('<h4>The current time is:</h4>') self.write('<h5 style="color:green">', asclocaltime(), '</h5>')
def testAsclocaltime(self): self.assertEqual(len(asclocaltime()), 24) t = time.time() self.assertEqual(asclocaltime(t), time.asctime(time.localtime(t)))