Find available port when starting backend plugin

CURA-11067
This commit is contained in:
c.lamboo 2023-09-20 11:24:28 +02:00
parent 26e7995588
commit d4449c680f
2 changed files with 11 additions and 3 deletions

View file

@ -1,5 +1,6 @@
# Copyright (c) 2023 Ultimaker B.V. # Copyright (c) 2023 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher. # Cura is released under the terms of the LGPLv3 or higher.
import socket
import subprocess import subprocess
from typing import Optional, List from typing import Optional, List
@ -42,6 +43,15 @@ class BackendPlugin(AdditionalSettingDefinitionsAppender, PluginObject):
def getAddress(self) -> str: def getAddress(self) -> str:
return self._plugin_address return self._plugin_address
def setAvailablePort(self) -> None:
"""
Sets the port to a random available port.
"""
sock = socket.socket()
sock.bind((self.getAddress(), 0))
port = sock.getsockname()[1]
self.setPort(port)
def _validatePluginCommand(self) -> list[str]: def _validatePluginCommand(self) -> list[str]:
""" """
Validate the plugin command and add the port parameter if it is missing. Validate the plugin command and add the port parameter if it is missing.

View file

@ -83,7 +83,6 @@ class CuraEngineBackend(QObject, Backend):
os.path.join(CuraApplication.getInstallPrefix(), "bin"), os.path.join(CuraApplication.getInstallPrefix(), "bin"),
os.path.dirname(os.path.abspath(sys.executable)), os.path.dirname(os.path.abspath(sys.executable)),
] ]
self._last_backend_plugin_port = self._port + 1000
for path in search_path: for path in search_path:
engine_path = os.path.join(path, executable_name) engine_path = os.path.join(path, executable_name)
if os.path.isfile(engine_path): if os.path.isfile(engine_path):
@ -205,8 +204,7 @@ class CuraEngineBackend(QObject, Backend):
for backend_plugin in backend_plugins: for backend_plugin in backend_plugins:
# Set the port to prevent plugins from using the same one. # Set the port to prevent plugins from using the same one.
if backend_plugin.getPort() < 1: if backend_plugin.getPort() < 1:
backend_plugin.setPort(self._last_backend_plugin_port) backend_plugin.setAvailablePort()
self._last_backend_plugin_port += 1
backend_plugin.start() backend_plugin.start()
def stopPlugins(self) -> None: def stopPlugins(self) -> None: