List of usage examples for org.apache.commons.exec CommandLine CommandLine
public CommandLine(final CommandLine other)
From source file:org.openflamingo.core.cmd.CommandLineExecutor.java
/** * ??? .//from w w w . ja va 2s. c o m * * @param args ?? ?? ? * @throws java.io.IOException ?? * @throws InterruptedException ?? */ public static void main(String[] args) throws IOException, InterruptedException { CommandLine cmdLine = new CommandLine("/bin/ls"); cmdLine.addArgument("-lsa"); cmdLine.addArgument("/"); /* cmdLine.addArgument("/p"); cmdLine.addArgument("/h"); cmdLine.addArgument("${file}"); HashMap map = new HashMap(); map.put("file", new File("invoice.pdf")); cmdLine.setSubstitutionMap(map); */ ByteArrayOutputStream out = new ByteArrayOutputStream(); TailExecuteResultHandler resultHandler = new TailExecuteResultHandler(); ExecuteWatchdog watchdog = new ExecuteWatchdog(500); Executor executor = new DefaultExecutor(); executor.setExitValue(1); executor.setWatchdog(watchdog); TailPumpStreamHandler psh = new TailPumpStreamHandler(out); executor.setStreamHandler(psh); executor.execute(cmdLine, resultHandler); System.out.println(out.toString()); resultHandler.waitFor(); }
From source file:org.openhab.binding.exec.internal.ExecBinding.java
/** * <p>Executes <code>commandLine</code>. Sometimes (especially observed on * MacOS) the commandLine isn't executed properly. In that cases another * exec-method is to be used. To accomplish this please use the special * delimiter '<code>@@</code>'. If <code>commandLine</code> contains this * delimiter it is split into a String[] array and the special exec-method * is used.</p>/*ww w. j a va2s .c o m*/ * <p>A possible {@link IOException} gets logged but no further processing is * done.</p> * * @param commandLine the command line to execute * @return response data from executed command line */ private String executeCommandAndWaitResponse(String commandLine) { String retval = null; CommandLine cmdLine = null; if (commandLine.contains(CMD_LINE_DELIMITER)) { String[] cmdArray = commandLine.split(CMD_LINE_DELIMITER); cmdLine = new CommandLine(cmdArray[0]); for (int i = 1; i < cmdArray.length; i++) { cmdLine.addArgument(cmdArray[i], false); } } else { cmdLine = CommandLine.parse(commandLine); } DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler(); ExecuteWatchdog watchdog = new ExecuteWatchdog(timeout); Executor executor = new DefaultExecutor(); ByteArrayOutputStream stdout = new ByteArrayOutputStream(); PumpStreamHandler streamHandler = new PumpStreamHandler(stdout); executor.setExitValue(1); executor.setStreamHandler(streamHandler); executor.setWatchdog(watchdog); try { executor.execute(cmdLine, resultHandler); logger.debug("executed commandLine '{}'", commandLine); } catch (ExecuteException e) { logger.error("couldn't execute commandLine '" + commandLine + "'", e); } catch (IOException e) { logger.error("couldn't execute commandLine '" + commandLine + "'", e); } // some time later the result handler callback was invoked so we // can safely request the exit code try { resultHandler.waitFor(); int exitCode = resultHandler.getExitValue(); retval = StringUtils.chomp(stdout.toString()); logger.debug("exit code '{}', result '{}'", exitCode, retval); } catch (InterruptedException e) { logger.error("Timeout occured when executing commandLine '" + commandLine + "'", e); } return retval; }
From source file:org.openhab.io.net.exec.ExecUtil.java
/** * <p>/*from w ww . j ava2 s .co m*/ * Executes <code>commandLine</code>. Sometimes (especially observed on * MacOS) the commandLine isn't executed properly. In that cases another * exec-method is to be used. To accomplish this please use the special * delimiter '<code>@@</code>'. If <code>commandLine</code> contains this * delimiter it is split into a String[] array and the special exec-method * is used. * </p> * <p> * A possible {@link IOException} gets logged but no further processing is * done. * </p> * * @param commandLine * the command line to execute * @param timeout * timeout for execution in milliseconds * @return response data from executed command line */ public static String executeCommandLineAndWaitResponse(String commandLine, int timeout) { String retval = null; CommandLine cmdLine = null; if (commandLine.contains(CMD_LINE_DELIMITER)) { String[] cmdArray = commandLine.split(CMD_LINE_DELIMITER); cmdLine = new CommandLine(cmdArray[0]); for (int i = 1; i < cmdArray.length; i++) { cmdLine.addArgument(cmdArray[i], false); } } else { cmdLine = CommandLine.parse(commandLine); } DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler(); ExecuteWatchdog watchdog = new ExecuteWatchdog(timeout); Executor executor = new DefaultExecutor(); ByteArrayOutputStream stdout = new ByteArrayOutputStream(); PumpStreamHandler streamHandler = new PumpStreamHandler(stdout); executor.setExitValue(1); executor.setStreamHandler(streamHandler); executor.setWatchdog(watchdog); try { executor.execute(cmdLine, resultHandler); logger.debug("executed commandLine '{}'", commandLine); } catch (ExecuteException e) { logger.error("couldn't execute commandLine '" + commandLine + "'", e); } catch (IOException e) { logger.error("couldn't execute commandLine '" + commandLine + "'", e); } // some time later the result handler callback was invoked so we // can safely request the exit code try { resultHandler.waitFor(); int exitCode = resultHandler.getExitValue(); retval = StringUtils.chomp(stdout.toString()); if (resultHandler.getException() != null) { logger.warn(resultHandler.getException().getMessage()); } else { logger.debug("exit code '{}', result '{}'", exitCode, retval); } } catch (InterruptedException e) { logger.error("Timeout occured when executing commandLine '" + commandLine + "'", e); } return retval; }
From source file:org.opennms.gizmo.k8s.portforward.KubeCtlPortForwardingStrategy.java
@Override public ForwardedPort portForward(String namespace, String pod, int remotePort) { CommandLine cmdLine = new CommandLine("kubectl"); cmdLine.addArgument("--namespace=${namespace}"); cmdLine.addArgument("port-forward"); cmdLine.addArgument("${pod}"); cmdLine.addArgument(":${remotePort}"); HashMap<String, String> map = new HashMap<>(); map.put("namespace", namespace); map.put("pod", pod); map.put("remotePort", Integer.toString(remotePort)); cmdLine.setSubstitutionMap(map);/* w w w .j a va 2s . c om*/ ByteArrayOutputStream out = new ByteArrayOutputStream(); ByteArrayOutputStream err = new ByteArrayOutputStream(); PumpStreamHandler psh = new PumpStreamHandler(out, err); DefaultExecutor executor = new DefaultExecutor(); final ExecuteWatchdog wd = new ExecuteWatchdog(ExecuteWatchdog.INFINITE_TIMEOUT); executor.setWatchdog(wd); executor.setStreamHandler(psh); DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler(); try { executor.execute(cmdLine, resultHandler); } catch (IOException e) { throw Throwables.propagate(e); } final int localPort = waitForLocalPort(wd, out, err); return new ForwardedPort() { @Override public InetSocketAddress getAddress() { return new InetSocketAddress(InetAddress.getLoopbackAddress(), localPort); } @Override public void close() throws IOException { wd.destroyProcess(); } @Override public String toString() { return String.format("ForwardedPort[localPort=%d]", localPort); } }; }
From source file:org.opennms.netmgt.integrations.R.RScriptExecutor.java
/** * Executes by given script by://from w w w . j a v a 2 s . c o m * - Searching both the classpath and the filesystem for the path * - Copying the script at the given path to a temporary file and * performing variable substitution with the arguments using Freemarker. * - Invoking the script with commons-exec * - Converting the input table to CSV and passing this to the process via stdin * - Parsing stdout, expecting CSV output, and converting this to an immutable table */ public RScriptOutput exec(String script, RScriptInput input) throws RScriptException { Preconditions.checkNotNull(script, "script argument"); Preconditions.checkNotNull(input, "input argument"); // Grab the script/template Template template; try { template = m_freemarkerConfiguration.getTemplate(script); } catch (IOException e) { throw new RScriptException("Failed to read the script.", e); } // Create a temporary file File scriptOnDisk; try { scriptOnDisk = File.createTempFile("Rcsript", "R"); scriptOnDisk.deleteOnExit(); } catch (IOException e) { throw new RScriptException("Failed to create a temporary file.", e); } // Perform variable substitution and write the results to the temporary file try (FileOutputStream fos = new FileOutputStream(scriptOnDisk); Writer out = new OutputStreamWriter(fos);) { template.process(input.getArguments(), out); } catch (IOException | TemplateException e) { scriptOnDisk.delete(); throw new RScriptException("Failed to process the template.", e); } // Convert the input matrix to a CSV string which will be passed to the script via stdin. // The table may be large, so we try and avoid writing it to disk StringBuilder inputTableAsCsv; try { inputTableAsCsv = toCsv(input.getTable()); } catch (IOException e) { scriptOnDisk.delete(); throw new RScriptException("Failed to convert the input table to CSV.", e); } // Invoke Rscript against the script (located in a temporary file) CommandLine cmdLine = new CommandLine(RSCRIPT_BINARY); cmdLine.addArgument(scriptOnDisk.getAbsolutePath()); // Use commons-exec to execute the process DefaultExecutor executor = new DefaultExecutor(); // Use the CharSequenceInputStream in order to avoid explicitly converting // the StringBuilder a string and then an array of bytes. InputStream stdin = new CharSequenceInputStream(inputTableAsCsv, Charset.forName("UTF-8")); ByteArrayOutputStream stderr = new ByteArrayOutputStream(); ByteArrayOutputStream stdout = new ByteArrayOutputStream(); executor.setStreamHandler(new PumpStreamHandler(stdout, stderr, stdin)); // Fail if we get a non-zero exit code executor.setExitValue(0); // Fail if the process takes too long ExecuteWatchdog watchdog = new ExecuteWatchdog(SCRIPT_TIMEOUT_MS); executor.setWatchdog(watchdog); // Execute try { executor.execute(cmdLine); } catch (IOException e) { scriptOnDisk.delete(); throw new RScriptException("An error occured while executing Rscript, or the requested script.", inputTableAsCsv.toString(), stderr.toString(), stdout.toString(), e); } // Parse and return the results try { ImmutableTable<Long, String, Double> table = fromCsv(stdout.toString()); return new RScriptOutput(table); } catch (Throwable t) { throw new RScriptException("Failed to parse the script's output.", inputTableAsCsv.toString(), stderr.toString(), stdout.toString(), t); } finally { scriptOnDisk.delete(); } }
From source file:org.opennms.netmgt.measurements.impl.RrdtoolXportFetchStrategy.java
/** * {@inheritDoc}/*ww w . ja v a 2s .c om*/ */ @Override protected FetchResults fetchMeasurements(long start, long end, long step, int maxrows, Map<Source, String> rrdsBySource, Map<String, Object> constants) throws RrdException { String rrdBinary = System.getProperty("rrd.binary"); if (rrdBinary == null) { throw new RrdException("No RRD binary is set."); } final long startInSeconds = (long) Math.floor(start / 1000); final long endInSeconds = (long) Math.floor(end / 1000); long stepInSeconds = (long) Math.floor(step / 1000); // The step must be strictly positive if (stepInSeconds <= 0) { stepInSeconds = 1; } final CommandLine cmdLine = new CommandLine(rrdBinary); cmdLine.addArgument("xport"); cmdLine.addArgument("--step"); cmdLine.addArgument("" + stepInSeconds); cmdLine.addArgument("--start"); cmdLine.addArgument("" + startInSeconds); cmdLine.addArgument("--end"); cmdLine.addArgument("" + endInSeconds); if (maxrows > 0) { cmdLine.addArgument("--maxrows"); cmdLine.addArgument("" + maxrows); } // Use labels without spaces when executing the xport command // These are mapped back to the requested labels in the response final Map<String, String> labelMap = Maps.newHashMap(); int k = 0; for (final Map.Entry<Source, String> entry : rrdsBySource.entrySet()) { final Source source = entry.getKey(); final String rrdFile = entry.getValue(); final String tempLabel = Integer.toString(++k); labelMap.put(tempLabel, source.getLabel()); cmdLine.addArgument(String.format("DEF:%s=%s:%s:%s", tempLabel, Utils.escapeColons(rrdFile), Utils.escapeColons(source.getEffectiveDataSource()), source.getAggregation())); cmdLine.addArgument(String.format("XPORT:%s:%s", tempLabel, tempLabel)); } // Use commons-exec to execute rrdtool final DefaultExecutor executor = new DefaultExecutor(); // Capture stdout/stderr final ByteArrayOutputStream stdout = new ByteArrayOutputStream(); final ByteArrayOutputStream stderr = new ByteArrayOutputStream(); executor.setStreamHandler(new PumpStreamHandler(stdout, stderr, null)); // Fail if we get a non-zero exit code executor.setExitValue(0); // Fail if the process takes too long final ExecuteWatchdog watchdog = new ExecuteWatchdog(XPORT_TIMEOUT_MS); executor.setWatchdog(watchdog); // Export RrdXport rrdXport; try { LOG.debug("Executing: {}", cmdLine); executor.execute(cmdLine); final XMLReader xmlReader = XMLReaderFactory.createXMLReader(); xmlReader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); final SAXSource source = new SAXSource(xmlReader, new InputSource(new StringReader(stdout.toString()))); final JAXBContext jc = JAXBContext.newInstance(RrdXport.class); final Unmarshaller u = jc.createUnmarshaller(); rrdXport = (RrdXport) u.unmarshal(source); } catch (IOException e) { throw new RrdException("An error occured while executing '" + StringUtils.join(cmdLine.toStrings(), " ") + "' with stderr: " + stderr.toString(), e); } catch (SAXException | JAXBException e) { throw new RrdException("The output generated by 'rrdtool xport' could not be parsed.", e); } final int numRows = rrdXport.getRows().size(); final int numColumns = rrdXport.getMeta().getLegends().size(); final long xportStartInMs = rrdXport.getMeta().getStart() * 1000; final long xportStepInMs = rrdXport.getMeta().getStep() * 1000; final long timestamps[] = new long[numRows]; final double values[][] = new double[numColumns][numRows]; // Convert rows to columns int i = 0; for (final XRow row : rrdXport.getRows()) { // Derive the timestamp from the start and step since newer versions // of rrdtool no longer include it as part of the rows timestamps[i] = xportStartInMs + xportStepInMs * i; for (int j = 0; j < numColumns; j++) { if (row.getValues() == null) { // NMS-7710: Avoid NPEs, in certain cases the list of values may be null throw new RrdException( "The output generated by 'rrdtool xport' was not recognized. Try upgrading your rrdtool binaries."); } values[j][i] = row.getValues().get(j); } i++; } // Map the columns by label // The legend entries are in the same order as the column values final Map<String, double[]> columns = Maps.newHashMapWithExpectedSize(numColumns); i = 0; for (String label : rrdXport.getMeta().getLegends()) { columns.put(labelMap.get(label), values[i++]); } return new FetchResults(timestamps, columns, xportStepInMs, constants); }
From source file:org.opennms.web.rest.measurements.fetch.RrdtoolXportFetchStrategy.java
/** * {@inheritDoc}/* w w w . ja v a2 s . co m*/ */ @Override protected FetchResults fetchMeasurements(long start, long end, long step, int maxrows, Map<Source, String> rrdsBySource, Map<String, Object> constants) throws RrdException { String rrdBinary = System.getProperty("rrd.binary"); if (rrdBinary == null) { throw new RrdException("No RRD binary is set."); } final long startInSeconds = (long) Math.floor(start / 1000); final long endInSeconds = (long) Math.floor(end / 1000); long stepInSeconds = (long) Math.floor(step / 1000); // The step must be strictly positive if (stepInSeconds <= 0) { stepInSeconds = 1; } final CommandLine cmdLine = new CommandLine(rrdBinary); cmdLine.addArgument("xport"); cmdLine.addArgument("--step"); cmdLine.addArgument("" + stepInSeconds); cmdLine.addArgument("--start"); cmdLine.addArgument("" + startInSeconds); cmdLine.addArgument("--end"); cmdLine.addArgument("" + endInSeconds); if (maxrows > 0) { cmdLine.addArgument("--maxrows"); cmdLine.addArgument("" + maxrows); } // Use labels without spaces when executing the xport command // These are mapped back to the requested labels in the response final Map<String, String> labelMap = Maps.newHashMap(); int k = 0; for (final Map.Entry<Source, String> entry : rrdsBySource.entrySet()) { final Source source = entry.getKey(); final String rrdFile = entry.getValue(); final String tempLabel = Integer.toString(++k); labelMap.put(tempLabel, source.getLabel()); cmdLine.addArgument(String.format("DEF:%s=%s:%s:%s", tempLabel, rrdFile, source.getAttribute(), source.getAggregation())); cmdLine.addArgument(String.format("XPORT:%s:%s", tempLabel, tempLabel)); } // Use commons-exec to execute rrdtool final DefaultExecutor executor = new DefaultExecutor(); // Capture stdout/stderr final ByteArrayOutputStream stdout = new ByteArrayOutputStream(); final ByteArrayOutputStream stderr = new ByteArrayOutputStream(); executor.setStreamHandler(new PumpStreamHandler(stdout, stderr, null)); // Fail if we get a non-zero exit code executor.setExitValue(0); // Fail if the process takes too long final ExecuteWatchdog watchdog = new ExecuteWatchdog(XPORT_TIMEOUT_MS); executor.setWatchdog(watchdog); // Export RrdXport rrdXport; try { executor.execute(cmdLine); final XMLReader xmlReader = XMLReaderFactory.createXMLReader(); xmlReader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); final SAXSource source = new SAXSource(xmlReader, new InputSource(new StringReader(stdout.toString()))); final JAXBContext jc = JAXBContext.newInstance(RrdXport.class); final Unmarshaller u = jc.createUnmarshaller(); rrdXport = (RrdXport) u.unmarshal(source); } catch (IOException e) { throw new RrdException("An error occured while executing '" + StringUtils.join(cmdLine.toStrings(), " ") + "' with stderr: " + stderr.toString(), e); } catch (SAXException | JAXBException e) { throw new RrdException("The output generated by 'rrdtool xport' could not be parsed.", e); } final int numRows = rrdXport.getRows().size(); final int numColumns = rrdXport.getMeta().getLegends().size(); final long timestamps[] = new long[numRows]; final double values[][] = new double[numColumns][numRows]; // Convert rows to columns int i = 0; for (final XRow row : rrdXport.getRows()) { timestamps[i] = row.getTimestamp() * 1000; for (int j = 0; j < numColumns; j++) { if (row.getValues() == null) { // NMS-7710: Avoid NPEs, in certain cases the list of values may be null throw new RrdException( "The output generated by 'rrdtool xport' was not recognized. Try upgrading your rrdtool binaries."); } values[j][i] = row.getValues().get(j); } i++; } // Map the columns by label // The legend entries are in the same order as the column values final Map<String, double[]> columns = Maps.newHashMapWithExpectedSize(numColumns); i = 0; for (String label : rrdXport.getMeta().getLegends()) { columns.put(labelMap.get(label), values[i++]); } return new FetchResults(timestamps, columns, rrdXport.getMeta().getStep() * 1000, constants); }
From source file:org.opennms.web.rest.v1.MeasurementsRestServiceITCase.java
protected static void assumeRrdtoolExists(final String libraryName) { final String libraryPath = System.getProperty("java.library.path", ""); if (!libraryPath.contains(":/usr/local/lib")) { System.setProperty("java.library.path", libraryPath + ":/usr/local/lib"); }//from w w w.j av a 2 s . co m boolean rrdtoolExists = false; try { final CommandLauncher cl = CommandLauncherFactory.createVMLauncher(); final Process p = cl.exec(new CommandLine(findRrdtool()), EnvironmentUtils.getProcEnvironment()); final int returnCode = p.waitFor(); LOG.debug("Loading library from java.library.path={}", System.getProperty("java.library.path")); System.loadLibrary(libraryName); rrdtoolExists = returnCode == 0; } catch (final Exception e) { LOG.warn("Failed to run 'rrdtool' or libjrrd(2)? is missing.", e); } Assume.assumeTrue(rrdtoolExists); }
From source file:org.openremote.controller.protocol.shellexe.ShellExeCommand.java
private String executeCommand() { logger.debug("Will start shell command: " + commandPath + " and use params: " + commandParams); String result = ""; Process proc = null;// w w w . j av a 2 s. c o m try { // Use the commons-exec to parse correctly the arguments, respecting quotes and spaces to separate parameters final CommandLine cmdLine = new CommandLine(commandPath); if (commandParams != null) { cmdLine.addArguments(commandParams); } proc = Runtime.getRuntime().exec(cmdLine.toStrings()); final BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream())); final StringBuffer resultBuffer = new StringBuffer(); boolean first = true; for (String tmp = reader.readLine(); tmp != null; tmp = reader.readLine()) { if (!first) resultBuffer.append("\n"); first = false; resultBuffer.append(tmp); } result = resultBuffer.toString(); } catch (IOException e) { logger.error("Could not execute shell command: " + commandPath, e); } finally { if (proc != null) proc.destroy(); } logger.debug("Shell command: " + commandPath + " returned: " + result); return result; }
From source file:org.owasp.goatdroid.gui.emulator.Emulator.java
static public boolean isAndroidDeviceAvailable() { ByteArrayOutputStream stdout = new ByteArrayOutputStream(); PumpStreamHandler psh = new PumpStreamHandler(stdout); try {/* ww w . ja v a2s . co m*/ CommandLine cmdLine = new CommandLine( Config.getSDKPath() + getSlash() + "platform-tools" + getSlash() + "adb"); cmdLine.addArgument("devices", false); DefaultExecutor executor = new DefaultExecutor(); executor.setStreamHandler(psh); executor.execute(cmdLine); String stringy = stdout.toString(); stdout.close(); /* * Shell command response will be 27 characters in length if there * are no devices currently attached. * * Output is: List of devices attached \n\n */ if (stringy.length() > 27) return true; else return false; } catch (CorruptConfigException e) { return false; } catch (IOException e) { return false; } }