| OLD | NEW |
| (Empty) |
| 1 # -*- test-case-name: twisted.test.test_twistd -*- | |
| 2 # Copyright (c) 2001-2008 Twisted Matrix Laboratories. | |
| 3 # See LICENSE for details. | |
| 4 | |
| 5 import warnings | |
| 6 | |
| 7 from twisted.python import log, logfile | |
| 8 from twisted.application import app, service, internet | |
| 9 from twisted import copyright | |
| 10 import sys, os | |
| 11 | |
| 12 class ServerOptions(app.ServerOptions): | |
| 13 synopsis = "Usage: twistd [options]" | |
| 14 | |
| 15 optFlags = [['nodaemon','n', "(for backwards compatability)."], | |
| 16 ] | |
| 17 | |
| 18 def opt_version(self): | |
| 19 """Print version information and exit. | |
| 20 """ | |
| 21 print 'twistd (the Twisted Windows runner) %s' % copyright.version | |
| 22 print copyright.copyright | |
| 23 sys.exit() | |
| 24 | |
| 25 | |
| 26 def _getLogObserver(logfilename): | |
| 27 """ | |
| 28 Create and return a suitable log observer for the given configuration. | |
| 29 | |
| 30 The observer will go to stdout if C{logfilename} is empty or equal to | |
| 31 C{"-"}. Otherwise, it will go to a file with that name. | |
| 32 | |
| 33 @type logfilename: C{str} | |
| 34 @param logfilename: The name of the file to which to log, if other than the | |
| 35 default. | |
| 36 | |
| 37 @return: An object suitable to be passed to C{log.addObserver}. | |
| 38 """ | |
| 39 if logfilename == '-' or not logfilename: | |
| 40 logFile = sys.stdout | |
| 41 else: | |
| 42 logFile = logfile.LogFile.fromFullPath(logfilename) | |
| 43 return log.FileLogObserver(logFile).emit | |
| 44 | |
| 45 | |
| 46 def startLogging(*args, **kw): | |
| 47 warnings.warn( | |
| 48 """ | |
| 49 Use ApplicationRunner instead of startLogging." | |
| 50 """, | |
| 51 category=PendingDeprecationWarning, | |
| 52 stacklevel=2) | |
| 53 observer = _getLogObserver(*args, **kw) | |
| 54 log.startLoggingWithObserver(observer) | |
| 55 sys.stdout.flush() | |
| 56 | |
| 57 | |
| 58 class WindowsApplicationRunner(app.ApplicationRunner): | |
| 59 """ | |
| 60 An ApplicationRunner which avoids unix-specific things. No | |
| 61 forking, no PID files, no privileges. | |
| 62 """ | |
| 63 def preApplication(self): | |
| 64 """ | |
| 65 Do pre-application-creation setup. | |
| 66 """ | |
| 67 self.oldstdout = sys.stdout | |
| 68 self.oldstderr = sys.stderr | |
| 69 os.chdir(self.config['rundir']) | |
| 70 | |
| 71 | |
| 72 def getLogObserver(self): | |
| 73 """ | |
| 74 Override to supply a log observer suitable for Windows based on the | |
| 75 given arguments. | |
| 76 """ | |
| 77 return _getLogObserver(self.config['logfile']) | |
| 78 | |
| 79 | |
| 80 def postApplication(self): | |
| 81 """ | |
| 82 Start the application and run the reactor. | |
| 83 """ | |
| 84 service.IService(self.application).privilegedStartService() | |
| 85 app.startApplication(self.application, not self.config['no_save']) | |
| 86 app.startApplication(internet.TimerService(0.1, lambda:None), 0) | |
| 87 self.startReactor(None, self.oldstdout, self.oldstderr) | |
| 88 log.msg("Server Shut Down.") | |
| OLD | NEW |