1 # -*- coding: utf-8 -*-
2 ##############################################################################
4 # OpenERP, Open Source Management Solution
5 # Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
6 # Copyright (C) 2010-2012 OpenERP SA (<http://www.openerp.com>)
8 # This program is free software: you can redistribute it and/or modify
9 # it under the terms of the GNU Affero General Public License as
10 # published by the Free Software Foundation, either version 3 of the
11 # License, or (at your option) any later version.
13 # This program is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU Affero General Public License for more details.
18 # You should have received a copy of the GNU Affero General Public License
19 # along with this program. If not, see <http://www.gnu.org/licenses/>.
21 ##############################################################################
33 import openerp.modules
38 #.apidoc title: RPC Services
40 """ Classes of this module implement the network protocols that the
41 OpenERP server uses to communicate with remote clients.
43 Some classes are mostly utilities, whose API need not be visible to
44 the average user/developer. Study them only if you are about to
45 implement an extension to the network protocols, or need to debug some
46 low-level behavior of the wire.
49 _logger = logging.getLogger(__name__)
51 def load_server_wide_modules():
52 for m in openerp.conf.server_wide_modules:
54 openerp.modules.module.load_openerp_module(m)
59 The `web` module is provided by the addons found in the `openerp-web` project.
60 Maybe you forgot to add those addons in your addons_path configuration."""
61 _logger.exception('Failed to load server-wide module `%s`.%s', m, msg)
63 start_internal_done = False
64 main_thread_id = threading.currentThread().ident
67 global start_internal_done
68 if start_internal_done:
70 openerp.netsvc.init_logger()
71 openerp.modules.loading.open_openerp_namespace()
73 # Instantiate local services (this is a legacy design).
74 openerp.osv.osv.start_object_proxy()
75 # Export (for RPC) services.
76 web_services.start_service()
78 load_server_wide_modules()
79 start_internal_done = True
82 """ Start all services including http, netrpc and cron """
84 # Initialize the NETRPC server.
85 netrpc_server.start_service()
86 # Start the WSGI server.
87 wsgi_server.start_service()
88 # Start the main cron thread.
92 """ Stop all services. """
95 netrpc_server.stop_service()
96 wsgi_server.stop_service()
98 _logger.info("Initiating shutdown")
99 _logger.info("Hit CTRL-C again or send a second signal to force the shutdown.")
102 # Manually join() all threads before calling sys.exit() to allow a second signal
103 # to trigger _force_quit() in case some non-daemon threads won't exit cleanly.
104 # threading.Thread.join() should not mask signals (at least in python 2.5).
105 me = threading.currentThread()
106 for thread in threading.enumerate():
107 if thread != me and not thread.isDaemon() and thread.ident != main_thread_id:
108 while thread.isAlive():
109 # Need a busyloop here as thread.join() masks signals
110 # and would prevent the forced shutdown.
114 openerp.modules.registry.RegistryManager.delete_all()
116 def start_services_workers():
117 import openerp.service.workers
118 openerp.multi_process = True
120 openerp.service.workers.Multicorn(openerp.service.wsgi_server.application).run()
123 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: