Search in sources :

Example 1 with TimeoutKillableObserver

use of com.google.copybara.shell.TimeoutKillableObserver in project copybara by google.

the class CommandRunner method execute.

/**
 * Executes a {@link Command} with the given input and writes to the console and the log depending
 * on the exit code of the command and the verbose flag.
 */
public CommandOutputWithStatus execute() throws CommandException {
    Stopwatch stopwatch = Stopwatch.createStarted();
    String startMsg = "Executing [" + ShellUtils.prettyPrintArgv(Arrays.asList(cmd.getCommandLineElements())) + "]";
    logger.log(Level.INFO, startMsg);
    if (verbose) {
        System.err.println(startMsg);
    }
    ByteArrayOutputStream stdoutCollector = new ByteArrayOutputStream();
    ByteArrayOutputStream stderrCollector = new ByteArrayOutputStream();
    OutputStream stdoutStream = commandOutputStream(stdoutCollector);
    OutputStream stderrStream = commandOutputStream(stderrCollector);
    TerminationStatus exitStatus = null;
    try {
        CommandResult cmdResult = cmd.execute(input, new TimeoutKillableObserver(COMMAND_TIMEOUT), stdoutStream, stderrStream, true);
        exitStatus = cmdResult.getTerminationStatus();
        return new CommandOutputWithStatus(cmdResult.getTerminationStatus(), stdoutCollector.toByteArray(), stderrCollector.toByteArray());
    } catch (BadExitStatusException e) {
        exitStatus = e.getResult().getTerminationStatus();
        throw new BadExitStatusWithOutputException(e.getCommand(), e.getResult(), e.getMessage(), stdoutCollector.toByteArray(), stderrCollector.toByteArray());
    } finally {
        String commandName = cmd.getCommandLineElements()[0];
        logOutput(Level.INFO, String.format("'%s' STDOUT: ", commandName), stdoutCollector, maxOutLogLines);
        logOutput(Level.INFO, String.format("'%s' STDERR: ", commandName), stderrCollector, maxOutLogLines);
        String finishMsg = String.format("Command '%s' finished in %s. %s", commandName, stopwatch, exitStatus != null ? exitStatus.toString() : "(No exit status)");
        logger.log(Level.INFO, finishMsg);
        if (verbose) {
            System.err.println(finishMsg);
        }
    }
}
Also used : TerminationStatus(com.google.copybara.shell.TerminationStatus) TimeoutKillableObserver(com.google.copybara.shell.TimeoutKillableObserver) OutputStream(java.io.OutputStream) ByteArrayOutputStream(java.io.ByteArrayOutputStream) Stopwatch(com.google.common.base.Stopwatch) ByteArrayOutputStream(java.io.ByteArrayOutputStream) BadExitStatusException(com.google.copybara.shell.BadExitStatusException) CommandResult(com.google.copybara.shell.CommandResult)

Example 2 with TimeoutKillableObserver

use of com.google.copybara.shell.TimeoutKillableObserver in project copybara by google.

the class GitCredential method fill.

/**
 * Execute 'git credential fill' for a url
 *
 * @param cwd the directory to execute the command. This is important if credential configuration
 * is set in the local git config.
 * @param url url to get the credentials from
 * @return a username and password
 * @throws RepoException If the url doesn't have protocol (For example https://), the url is
 * not valid or username/password couldn't be found
 */
public UserPassword fill(Path cwd, String url) throws RepoException, ValidationException {
    Map<String, String> env = Maps.newHashMap(this.env);
    // Prevent from asking user for the password (It goes directly to the terminal, not to the
    // passed InputStream/OutputStream.
    env.put("GIT_TERMINAL_PROMPT", "0");
    URI uri;
    try {
        uri = URI.create(url);
    } catch (IllegalArgumentException e) {
        throw new ValidationException(e, "Cannot get credentials for " + url);
    }
    String protocol = uri.getScheme();
    if (Strings.isNullOrEmpty(protocol)) {
        throw new ValidationException("Cannot find the protocol for " + url);
    }
    String host = uri.getHost();
    Command cmd = new Command(new String[] { gitBinary, "credential", "fill" }, env, cwd.toFile());
    String request = String.format("protocol=%s\nhost=%s\n", protocol, host);
    if (!Strings.isNullOrEmpty(uri.getPath())) {
        request += String.format("path=%s\n", uri.getPath());
    }
    request += "\n";
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    ByteArrayOutputStream err = new ByteArrayOutputStream();
    try {
        // DON'T REPLACE THIS WITH CommandRunner.execute(). WE DON'T WANT TO ACCIDENTALLY LOG THE
        // PASSWORD!
        CommandResult result = cmd.execute(new ByteArrayInputStream(request.getBytes(UTF_8)), new TimeoutKillableObserver(timeout.toMillis()), out, err);
        if (!result.getTerminationStatus().success()) {
            throw new RepoException("Error getting credentials:\n" + new String(err.toByteArray(), UTF_8));
        }
    } catch (BadExitStatusException e) {
        String errStr = new String(err.toByteArray(), UTF_8);
        if (errStr.contains("could not read")) {
            throw new ValidationException("Interactive prompting of passwords for git is disabled," + " use git credential store before calling Copybara.");
        }
        throw new RepoException("Error getting credentials:\n" + errStr, e);
    } catch (CommandException e) {
        throw new RepoException("Error getting credentials", e);
    }
    Map<String, String> map = Splitter.on(NEW_LINE).omitEmptyStrings().withKeyValueSeparator("=").split(new String(out.toByteArray(), UTF_8));
    if (!map.containsKey("username")) {
        throw new RepoException("git credentials for " + url + " didn't return a username");
    }
    if (!map.containsKey("password")) {
        throw new RepoException("git credentials for " + url + " didn't return a password");
    }
    return new UserPassword(map.get("username"), map.get("password"));
}
Also used : ValidationException(com.google.copybara.exception.ValidationException) TimeoutKillableObserver(com.google.copybara.shell.TimeoutKillableObserver) ByteArrayOutputStream(java.io.ByteArrayOutputStream) RepoException(com.google.copybara.exception.RepoException) CommandException(com.google.copybara.shell.CommandException) URI(java.net.URI) CommandResult(com.google.copybara.shell.CommandResult) Command(com.google.copybara.shell.Command) ByteArrayInputStream(java.io.ByteArrayInputStream) BadExitStatusException(com.google.copybara.shell.BadExitStatusException)

Aggregations

BadExitStatusException (com.google.copybara.shell.BadExitStatusException)2 CommandResult (com.google.copybara.shell.CommandResult)2 TimeoutKillableObserver (com.google.copybara.shell.TimeoutKillableObserver)2 ByteArrayOutputStream (java.io.ByteArrayOutputStream)2 Stopwatch (com.google.common.base.Stopwatch)1 RepoException (com.google.copybara.exception.RepoException)1 ValidationException (com.google.copybara.exception.ValidationException)1 Command (com.google.copybara.shell.Command)1 CommandException (com.google.copybara.shell.CommandException)1 TerminationStatus (com.google.copybara.shell.TerminationStatus)1 ByteArrayInputStream (java.io.ByteArrayInputStream)1 OutputStream (java.io.OutputStream)1 URI (java.net.URI)1