1 package com.proalpha.pds.paconnector.utils;
3 import java.io.BufferedReader;
4 import java.io.IOException;
5 import java.io.InputStreamReader;
7 import java.lang.ProcessBuilder.Redirect;
8 import java.util.HashMap;
9 import java.util.regex.Matcher;
10 import java.util.regex.Pattern;
12 import org.slf4j.Logger;
13 import org.slf4j.LoggerFactory;
17 HashMap<String, String> pyModuleVersions =
new HashMap<String, String>();
21 this.pyModuleVersions.put(
"pa-installer",
"0.0.27");
24 private HashMap<String, String> getPythonModules() {
27 ProcessBuilder builder =
new ProcessBuilder();
28 HashMap<String, String> resultLines =
new HashMap<String, String>();
30 final String regex =
"([a-zA-Z0-9-]{1,}\\s*)([0-9]{1,4}(\\.[0-9]+){0,3})";
31 final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
34 builder.command(
"python",
"-m",
"pip",
"list");
35 builder.redirectErrorStream(
true);
36 builder.redirectInput(Redirect.PIPE);
37 builder.redirectOutput(Redirect.PIPE);
41 final Process p = builder.start();
42 logger.info(
"query python modules. call '{}'", builder.command());
44 try (Reader rOut =
new InputStreamReader(p.getInputStream());
45 BufferedReader inOut =
new BufferedReader(rOut)) {
50 line = inOut.readLine();
56 Matcher m = pattern.matcher(line);
59 resultLines.put(m.group(1).trim(), m.group(2).trim());
60 logger.debug(
"add modulinfo " + line);
62 logger.debug(
"skip line " + line);
65 }
while (line !=
null);
69 Integer callExitValue = p.waitFor();
70 if (callExitValue != 0)
73 }
catch (IOException | InterruptedException e) {
82 public Boolean pythonVersionsMatch() {
84 Boolean pyVersionsMatch =
true;
86 HashMap<String, String> currentPythonModules = getPythonModules();
88 for (String pymodname : pyModuleVersions.keySet()) {
90 String moduleversion = currentPythonModules.get(pymodname);
92 if (moduleversion ==
null)
93 pyVersionsMatch =
false;
96 String[] currentVersion = currentPythonModules.get(pymodname).split(
"\\.");
97 String[] neededVersion = pyModuleVersions.get(pymodname).split(
"\\.");
99 if (currentVersion.length != neededVersion.length)
100 pyVersionsMatch =
false;
104 for (Integer i = 0; i < currentVersion.length; i++) {
106 Integer current = Integer.parseInt(currentVersion[i]);
107 Integer needed = Integer.parseInt(neededVersion[i]);
109 if (current > needed)
111 if (current < needed)
112 pyVersionsMatch =
false;
118 logger.debug(String.format(
"module %s got version %s. needed version is %s", pymodname,
119 currentPythonModules.get(pymodname), pyModuleVersions.get(pymodname)));
121 if (!pyVersionsMatch)
126 return pyVersionsMatch;