diff -r 058bb3dc685f -r 0b59724cb3f2 etwist/service.py --- a/etwist/service.py Mon Jan 04 18:40:30 2016 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,99 +0,0 @@ -# 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)