LocalRuntimeMixin.py
author Edouard Tisserant <edouard.tisserant@gmail.com>
Mon, 22 May 2023 14:37:15 +0200
changeset 3812 92e528718733
parent 3777 a26453d1c54d
child 3847 832c257d5618
permissions -rw-r--r--
CLI: simpler status polling, fixing pyro5 thread
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import sys
import tempfile
import random
import shutil

from util.ProcessLogger import ProcessLogger
from util.paths import Bpath

_exec = sys.executable if "darwin" not in sys.platform else sys.executable + 'w'
LocalRuntimeInterpreterPath = os.environ.get("BEREMIZPYTHONPATH", _exec)

LocalHost = os.environ.get("BEREMIZ_LOCAL_HOST", "localhost")

class LocalRuntimeMixin():

    def __init__(self, log, use_gui=True):
        self.local_runtime_log = log
        self.local_runtime = None
        self.runtime_port = None
        self.local_runtime_tmpdir = None
        self.use_gui = use_gui

    def StartLocalRuntime(self):
        if (self.local_runtime is None) or (self.local_runtime.exitcode is not None):
            # create temporary directory for runtime working directory
            self.local_runtime_tmpdir = tempfile.mkdtemp()
            # choose an arbitrary random port for runtime
            self.runtime_port = int(random.random() * 1000) + 61131
            self.local_runtime_log.write(_("Starting local runtime...\n"))
            # launch local runtime
            self.local_runtime = ProcessLogger(
                self.local_runtime_log,
                ("\"%s\" \"%s\" -p %s -i "+LocalHost+" %s %s") % (
                    LocalRuntimeInterpreterPath,
                    Bpath("Beremiz_service.py"),
                    self.runtime_port,
                    {False: "-x 0", True: "-x 1"}[self.use_gui],
                    self.local_runtime_tmpdir),
                no_gui=False,
                timeout=500, keyword=self.local_runtime_tmpdir,
                cwd=self.local_runtime_tmpdir)
            self.local_runtime.spin()
        return self.runtime_port

    def KillLocalRuntime(self):
        if self.local_runtime is not None:
            # shutdown local runtime
            self.local_runtime.kill(gently=False)
            # clear temp dir
            shutil.rmtree(self.local_runtime_tmpdir)

            self.local_runtime = None