package dev.dinauer; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import org.eclipse.microprofile.context.ManagedExecutor; import org.jboss.logging.Logger; @ApplicationScoped public class ProcessRunner { @Inject Logger LOG; @Inject ManagedExecutor executor; public String runToText(String command) { return String.join("\n", runToLines(command)); } public List runToLines(String command) { LOG.infof("Running command: %s", command); ProcessBuilder pb = new ProcessBuilder(command.split("\\s+")); pb.redirectErrorStream(true); try { return runAndCollectLogs(pb); } catch (InterruptedException | IOException e) { throw new RuntimeException(e); } } private List runAndCollectLogs(ProcessBuilder processBuilder) throws InterruptedException, IOException { List text = new ArrayList<>(); Process process = processBuilder.start(); executor.submit(() -> { try (BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()))) { String line; while ((line = br.readLine()) != null) { text.add(line); } } catch (IOException e) { throw new RuntimeException(e); } }); boolean endedInTime = process.waitFor(10, TimeUnit.SECONDS); int exitCode = process.exitValue(); process.destroyForcibly(); if (endedInTime) { if (exitCode == 0) { return text; } else { throw new RuntimeException("Process finished with code " + exitCode); } } else { throw new RuntimeException("Process exceeded wait time of 10 sec."); } } }