Skip to content
Snippets Groups Projects
win32_service.py 1.78 KiB
Newer Older
# -*- coding: utf-8 -*-
Christophe Simonis's avatar
Christophe Simonis committed

Priyesh Solanki's avatar
Priyesh Solanki committed
import win32api
import win32process
import win32service
import win32serviceutil
Priyesh Solanki's avatar
Priyesh Solanki committed

import subprocess
import sys
from os.path import dirname, join, split


execfile(join(dirname(__file__), '..', 'server', 'openerp', 'release.py'))
Priyesh Solanki's avatar
Priyesh Solanki committed

class OdooService(win32serviceutil.ServiceFramework):
    _svc_name_ = nt_service_name
    _svc_display_name_ = "%s %s" % (nt_service_name, serie)
Priyesh Solanki's avatar
Priyesh Solanki committed

    def __init__(self, args):
        win32serviceutil.ServiceFramework.__init__(self, args)
        self.odooprocess = None  # Reference to the server's process
Priyesh Solanki's avatar
Priyesh Solanki committed

    def SvcStop(self):
        # Before we do anything, tell the SCM we are starting the stop process.
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        # Stop the running Odoo: say it's a normal exit
        win32api.TerminateProcess(int(self.odooprocess._handle), 0)
        servicemanager.LogInfoMsg("Odoo stopped correctly")
Priyesh Solanki's avatar
Priyesh Solanki committed

Stéphane Wirtel's avatar
Stéphane Wirtel committed
    def SvcDoRun(self):
        # We start Odoo as an independent process, but we keep its handle
        service_dir = dirname(sys.argv[0])
        server_dir = split(service_dir)[0]
        server_path = join(server_dir, 'server', 'openerp-server.exe')
        self.odooprocess = subprocess.Popen(
            [server_path], cwd=server_dir, creationflags=win32process.CREATE_NO_WINDOW
        )
        servicemanager.LogInfoMsg('Odoo up and running')
        # exit with same exit code as Odoo process
        sys.exit(self.odooprocess.wait())


def option_handler(opts):
    # configure the service to auto restart on failures...
    subprocess.call([
        'sc', 'failure', nt_service_name, 'reset=', '0', 'actions=', 'restart/0/restart/0/restart/0'
    ])
if __name__ == '__main__':
    win32serviceutil.HandleCommandLine(OdooService, customOptionHandler=option_handler)