@Override
public int execCommands(Map<String,?> props, List<String> commands, Map<String,?> env) {
if (Boolean.FALSE.equals(props.get("blocks"))) {
throw new IllegalArgumentException("Cannot exec non-blocking: command="+commands);
}
Boolean execAsync = getOptionalVal(props, PROP_EXEC_ASYNC);
if (Boolean.TRUE.equals(execAsync) && BrooklynFeatureEnablement.isEnabled(BrooklynFeatureEnablement.FEATURE_SSH_ASYNC_EXEC)) {
return execScriptAsyncAndPoll(props, commands, env);
}
OutputStream out = getOptionalVal(props, PROP_OUT_STREAM);
OutputStream err = getOptionalVal(props, PROP_ERR_STREAM);
String separator = getOptionalVal(props, PROP_SEPARATOR);
Duration execTimeout = getOptionalVal(props, PROP_EXEC_TIMEOUT);
List<String> allcmds = toCommandSequence(commands, env);
String singlecmd = Joiner.on(separator).join(allcmds);
if (Boolean.TRUE.equals(getOptionalVal(props, PROP_RUN_AS_ROOT))) {
LOG.warn("Cannot run as root when executing as command; run as a script instead (will run as normal user): "+singlecmd);
}
if (LOG.isTraceEnabled()) LOG.trace("Running command at {}: {}", host, singlecmd);
Command result = acquire(new ExecAction(singlecmd, out, err, execTimeout));
if (LOG.isTraceEnabled()) LOG.trace("Running command at {} completed: exit code {}", host, result.getExitStatus());
if (result.getExitStatus()==null) LOG.warn("Null exit status running at {}: {}", host, singlecmd);
return asInt(result.getExitStatus(), -1);
}