diff -r 058bb3dc685f -r 0b59724cb3f2 cubicweb/etwist/service.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cubicweb/etwist/service.py Sat Jan 16 13:48:51 2016 +0100 @@ -0,0 +1,99 @@ +# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr +# +# This file is part of CubicWeb. +# +# CubicWeb is free software: you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation, either version 2.1 of the License, or (at your option) +# any later version. +# +# CubicWeb is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License along +# with CubicWeb. If not, see . +from __future__ import print_function + +import os +import sys + +try: + import win32serviceutil + import win32service +except ImportError: + print('Win32 extensions for Python are likely not installed.') + sys.exit(3) + +from os.path import join + +from cubicweb.etwist.server import (CubicWebRootResource, reactor, server) + +from logilab.common.shellutils import rm + +import logging +from logging import getLogger, handlers +from cubicweb import set_log_methods +from cubicweb.cwconfig import CubicWebConfiguration as cwcfg + +def _check_env(env): + env_vars = ('CW_INSTANCES_DIR', 'CW_INSTANCES_DATA_DIR', 'CW_RUNTIME_DIR') + for var in env_vars: + if var not in env: + raise Exception('The environment variables %s must be set.' % \ + ', '.join(env_vars)) + if not env.get('USERNAME'): + env['USERNAME'] = 'cubicweb' + +class CWService(object, win32serviceutil.ServiceFramework): + _svc_name_ = None + _svc_display_name_ = None + instance = None + + def __init__(self, *args, **kwargs): + win32serviceutil.ServiceFramework.__init__(self, *args, **kwargs) + cwcfg.load_cwctl_plugins() + logger = getLogger('cubicweb') + set_log_methods(CubicWebRootResource, logger) + + def SvcStop(self): + self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) + logger = getLogger('cubicweb.twisted') + logger.info('stopping %s service' % self.instance) + reactor.stop() + self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) + + def SvcDoRun(self): + self.ReportServiceStatus(win32service.SERVICE_START_PENDING) + logger = getLogger('cubicweb.twisted') + handler = handlers.NTEventLogHandler('cubicweb') + handler.setLevel(logging.INFO) + logger.addHandler(handler) + logger.info('starting %s service' % self.instance) + try: + _check_env(os.environ) + # create the site + config = cwcfg.config_for(self.instance) + config.init_log(force=True) + config.debugmode = False + logger.info('starting cubicweb instance %s ', self.instance) + config.info('clear ui caches') + for cachedir in ('uicache', 'uicachehttps'): + rm(join(config.appdatahome, cachedir, '*')) + root_resource = CubicWebRootResource(config, config.repository()) + website = server.Site(root_resource) + # serve it via standard HTTP on port set in the configuration + port = config['port'] or 8080 + logger.info('listening on port %s' % port) + reactor.listenTCP(port, website) + root_resource.init_publisher() + root_resource.start_service() + logger.info('instance started on %s', root_resource.base_url) + self.ReportServiceStatus(win32service.SERVICE_RUNNING) + reactor.run() + except Exception as e: + logger.error('service %s stopped (cause: %s)' % (self.instance, e)) + logger.exception('what happened ...') + self.ReportServiceStatus(win32service.SERVICE_STOPPED)