Package web2py :: Package gluon :: Module winservice
[hide private]
[frames] | no frames]

Source Code for Module web2py.gluon.winservice

  1  #!/usr/bin/env python 
  2  # -*- coding: utf-8 -*- 
  3  """ 
  4  This file is part of the web2py Web Framework 
  5  Developed by Massimo Di Pierro <mdipierro@cs.depaul.edu> and 
  6  Limodou <limodou@gmail.com>. 
  7  License: LGPLv3 (http://www.gnu.org/licenses/lgpl.html) 
  8   
  9  This makes uses of the pywin32 package 
 10  (http://sourceforge.net/projects/pywin32/). 
 11  You do not need to install this package to use web2py. 
 12   
 13   
 14  """ 
 15   
 16  import time 
 17  import os 
 18  import sys 
 19  import traceback 
 20  try: 
 21      import win32serviceutil 
 22      import win32service 
 23      import win32event 
 24  except: 
 25      if os.name == 'nt': 
 26          print "Warning, winservice is unable to install the Mark Hammond Win32 extensions" 
 27  import servicemanager 
 28  import _winreg 
 29  from fileutils import up 
 30   
 31  __all__ = ['web2py_windows_service_handler'] 
 32   
33 -class Service(win32serviceutil.ServiceFramework):
34 35 _svc_name_ = '_unNamed' 36 _svc_display_name_ = '_Service Template' 37
38 - def __init__(self, *args):
39 win32serviceutil.ServiceFramework.__init__(self, *args) 40 self.stop_event = win32event.CreateEvent(None, 0, 0, None)
41
42 - def log(self, msg):
43 servicemanager.LogInfoMsg(str(msg))
44
45 - def SvcDoRun(self):
46 self.ReportServiceStatus(win32service.SERVICE_START_PENDING) 47 try: 48 self.ReportServiceStatus(win32service.SERVICE_RUNNING) 49 self.start() 50 win32event.WaitForSingleObject(self.stop_event, 51 win32event.INFINITE) 52 except: 53 self.log(traceback.format_exc(sys.exc_info)) 54 self.SvcStop() 55 self.ReportServiceStatus(win32service.SERVICE_STOPPED)
56
57 - def SvcStop(self):
58 self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) 59 try: 60 self.stop() 61 except: 62 self.log(traceback.format_exc(sys.exc_info)) 63 win32event.SetEvent(self.stop_event) 64 self.ReportServiceStatus(win32service.SERVICE_STOPPED)
65 66 # to be overridden 67
68 - def start(self):
69 pass
70 71 # to be overridden 72
73 - def stop(self):
74 pass
75 76
77 -class Web2pyService(Service):
78 79 _svc_name_ = 'web2py' 80 _svc_display_name_ = 'web2py Service' 81 _exe_args_ = 'options' 82 server = None 83
84 - def chdir(self):
85 try: 86 h = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, 87 r'SYSTEM\CurrentControlSet\Services\%s' 88 % self._svc_name_) 89 cls = _winreg.QueryValue(h, 'PythonClass') 90 dir = os.path.dirname(cls) 91 os.chdir(dir) 92 return True 93 except: 94 self.log("Can't change to web2py working path; server is stopped") 95 return False
96
97 - def start(self):
98 self.log('web2py server starting') 99 if not self.chdir(): 100 return 101 if len(sys.argv) == 2: 102 opt_mod = sys.argv[1] 103 else: 104 opt_mod = self._exe_args_ 105 options = __import__(opt_mod, [], [], '') 106 if True: # legacy support for old options files, which have only (deprecated) numthreads 107 if hasattr(options, 'numthreads') and not hasattr(options, 'minthreads'): 108 options.minthreads = options.numthreads 109 if not hasattr(options, 'minthreads'): options.minthreads = None 110 if not hasattr(options, 'maxthreads'): options.maxthreads = None 111 import main 112 self.server = main.HttpServer( 113 ip=options.ip, 114 port=options.port, 115 password=options.password, 116 pid_filename=options.pid_filename, 117 log_filename=options.log_filename, 118 profiler_filename=options.profiler_filename, 119 ssl_certificate=options.ssl_certificate, 120 ssl_private_key=options.ssl_private_key, 121 min_threads=options.minthreads, 122 max_threads=options.maxthreads, 123 server_name=options.server_name, 124 request_queue_size=options.request_queue_size, 125 timeout=options.timeout, 126 shutdown_timeout=options.shutdown_timeout, 127 path=options.folder 128 ) 129 try: 130 self.server.start() 131 except: 132 133 # self.server.stop() 134 135 self.server = None 136 raise
137
138 - def stop(self):
139 self.log('web2py server stopping') 140 if not self.chdir(): 141 return 142 if self.server: 143 self.server.stop() 144 time.sleep(1)
145 146
147 -def web2py_windows_service_handler(argv=None, opt_file='options'):
148 path = os.path.dirname(__file__) 149 classstring = os.path.normpath(os.path.join(up(path), 150 'gluon.winservice.Web2pyService')) 151 if opt_file: 152 Web2pyService._exe_args_ = opt_file 153 win32serviceutil.HandleCommandLine(Web2pyService, 154 serviceClassString=classstring, argv=['', 'install']) 155 win32serviceutil.HandleCommandLine(Web2pyService, 156 serviceClassString=classstring, argv=argv)
157 158 159 if __name__ == '__main__': 160 web2py_windows_service_handler() 161