[pythonscripting] Fix helper lib deployment on Windows (#18659)

* refactoring helper lib deployment
* fix resourceSeparator handling
* disable warning about missing truffleatach library
This commit is contained in:
Holger Hees
2025-05-09 08:44:37 +02:00
committed by GitHub
parent 6f2a4eb5b6
commit ee3d3af814
2 changed files with 35 additions and 9 deletions
@@ -30,6 +30,7 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
@@ -74,6 +75,8 @@ public class PythonScriptEngine
implements Lock {
private final Logger logger = LoggerFactory.getLogger(PythonScriptEngine.class);
private static final String SYSTEM_PROPERTY_ATTACH_LIBRARY_FAILURE_ACTION = "polyglotimpl.AttachLibraryFailureAction";
private static final String PYTHON_OPTION_EXECUTABLE = "python.Executable";
private static final String PYTHON_OPTION_PYTHONHOME = "python.PythonHome";
private static final String PYTHON_OPTION_PYTHONPATH = "python.PythonPath";
@@ -164,6 +167,10 @@ public class PythonScriptEngine
lifecycleTracker = new LifecycleTracker();
scriptExtensionModuleProvider = new ScriptExtensionModuleProvider();
// disable warning about missing TruffleAttach library (is only available in graalvm)
Properties props = System.getProperties();
props.setProperty(SYSTEM_PROPERTY_ATTACH_LIBRARY_FAILURE_ACTION, "ignore");
Context.Builder contextConfig = Context.newBuilder(GraalPythonScriptEngine.LANGUAGE_ID) //
.out(scriptOutputStream) //
.err(scriptErrorStream) //
@@ -19,10 +19,10 @@ import java.io.InputStreamReader;
import java.lang.module.ModuleDescriptor.Version;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.PosixFilePermissions;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Enumeration;
@@ -66,6 +66,8 @@ import org.slf4j.LoggerFactory;
public class PythonScriptEngineFactory implements ScriptEngineFactory {
private final Logger logger = LoggerFactory.getLogger(PythonScriptEngineFactory.class);
private static final String RESOURCE_SEPARATOR = "/";
public static final Path PYTHON_DEFAULT_PATH = Paths.get(OpenHAB.getConfigFolder(), "automation", "python");
public static final Path PYTHON_LIB_PATH = PYTHON_DEFAULT_PATH.resolve("lib");
@@ -132,11 +134,12 @@ public class PythonScriptEngineFactory implements ScriptEngineFactory {
private void initHelperLib() {
try {
String pathSeparator = FileSystems.getDefault().getSeparator();
String resourceLibPath = PYTHON_OPENHAB_LIB_PATH.toString()
.substring(PYTHON_DEFAULT_PATH.toString().length()) + "/";
Enumeration<URL> resourceFiles = FrameworkUtil.getBundle(PythonScriptEngineFactory.class)
.findEntries(resourceLibPath, "*.py", true);
.substring(PYTHON_DEFAULT_PATH.toString().length()) + pathSeparator;
if (!RESOURCE_SEPARATOR.equals(pathSeparator)) {
resourceLibPath = resourceLibPath.replace(pathSeparator, RESOURCE_SEPARATOR);
}
if (Files.exists(PythonScriptEngineFactory.PYTHON_OPENHAB_LIB_PATH)) {
try (Stream<Path> files = Files.list(PYTHON_OPENHAB_LIB_PATH)) {
@@ -186,8 +189,12 @@ public class PythonScriptEngineFactory implements ScriptEngineFactory {
}
}
Files.createDirectories(PythonScriptEngineFactory.PYTHON_OPENHAB_LIB_PATH,
PosixFilePermissions.asFileAttribute(PosixFilePermissions.fromString("rwxr-xr-x")));
initDirectory(PythonScriptEngineFactory.PYTHON_DEFAULT_PATH);
initDirectory(PythonScriptEngineFactory.PYTHON_LIB_PATH);
initDirectory(PythonScriptEngineFactory.PYTHON_OPENHAB_LIB_PATH);
Enumeration<URL> resourceFiles = FrameworkUtil.getBundle(PythonScriptEngineFactory.class)
.findEntries(resourceLibPath, "*.py", true);
while (resourceFiles.hasMoreElements()) {
URL resourceFile = resourceFiles.nextElement();
@@ -196,14 +203,26 @@ public class PythonScriptEngineFactory implements ScriptEngineFactory {
try (InputStream is = PythonScriptEngineFactory.class.getClassLoader()
.getResourceAsStream(resourcePath)) {
Path target = PythonScriptEngineFactory.PYTHON_OPENHAB_LIB_PATH
.resolve(resourcePath.substring(resourcePath.lastIndexOf('/') + 1));
.resolve(resourcePath.substring(resourcePath.lastIndexOf(RESOURCE_SEPARATOR) + 1));
Files.copy(is, target);
Files.setPosixFilePermissions(target, PosixFilePermissions.fromString("rw-r--r--"));
File file = target.toFile();
file.setReadable(true, false);
file.setWritable(true, true);
}
}
} catch (Exception e) {
logger.error("Exception during helper lib initialisation", e);
}
}
private void initDirectory(Path path) {
File directory = path.toFile();
if (!directory.exists()) {
directory.mkdir();
directory.setExecutable(true, false);
directory.setReadable(true, false);
directory.setWritable(true, true);
}
}
}