/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.embedded.ssh.internal; import java.io.IOException; import java.io.OutputStream; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import de.rcenvironment.core.command.api.CommandExecutionService; import de.rcenvironment.core.command.common.CommandException; import de.rcenvironment.core.command.spi.AbstractInteractiveCommandConsole; import de.rcenvironment.core.utils.common.StringUtils; /** * Class for handling command input and printing out the output. * * @author Sebastian Holtappels * @author Robert Mischke */ public class SshConsoleOutputAdapter extends AbstractInteractiveCommandConsole { private static final String OUTPUT_TAB_REPLACEMENT = " "; @Deprecated private boolean outputEnabled = true; private String activeUser; private String consolePromptString; private OutputStream out; private OutputStream err; private final CommandExecutionService commandExecutionService; private final Log logger = LogFactory.getLog(getClass()); // TextOutputReciever Methods - START public SshConsoleOutputAdapter(CommandExecutionService commandExecutionService) { super(commandExecutionService); this.commandExecutionService = commandExecutionService; } @Override public void onStart() { // not needed // could be used to block input of new chars until output is done } @Override public void addOutput(String output) { addOutput(output, true, true); } /** * * Adds an Output to the console. * * @param output the output * @param lineBreak true, when a line break should be added * @param formatString true, when a output should be "formatted" */ public void addOutput(String output, boolean lineBreak, boolean formatString) { if (formatString) { output = output.replace("\n", "\r\n"); output = output.replaceAll("\t", OUTPUT_TAB_REPLACEMENT); } if (lineBreak) { output = output + "\r\n"; } writeToConsole(output); } // TextOutputReciever Methods - END // Handling the output - START /** * * Prints the help text to the console. * * @param ce - the command exception (if it exists) */ public void printHelp(CommandException ce) { commandExecutionService.printHelpText(false, false, this); } /** * * Prints out a welcome message to the console. Includes a call to newConsoleLine. * * @throws IOException */ public void printWelcome() { StringBuilder welcome = new StringBuilder(); welcome.append("Welcome to the RCE SSH console, " + activeUser + "!"); // TODO idea: filter the "help" output using the role filter? - misc_ro welcome.append("\r\nType \"help\" for a list of console commands. Please note that depending on your " + "\r\naccount's security settings, you may not be able to use all commands."); welcome.append("\r\nType \"exit\" to end the current session."); addOutput(welcome.toString(), true, false); } /** * * Prints out a line break and a new console prefix. * */ public void printConsolePrompt() { if (consolePromptString == null) { String template = SshConstants.CONSOLE_PROMPT_TEMPLATE; consolePromptString = StringUtils.format(template, activeUser); } writeToConsole(consolePromptString); } /** * * For handling the exception and centrally blocking the output if in command mode. * * @param output */ private void writeToConsole(String output) { if (outputEnabled) { try { out.write(output.getBytes()); out.flush(); } catch (IOException e) { logger.error("Could not print " + output, e); } } else { logger.warn("Tried to add output, but output was not enabled: " + output); } } // Handling the output - END // Destroy the ConsoleHandler - START /** * * Closes the streams for the console. * */ public void destroy() { try { out.close(); } catch (IOException e) { logger.error("Error closing stdout stream of SSH shell: " + e.toString()); } try { err.close(); } catch (IOException e) { logger.error("Error closing stderr stream of SSH shell: " + e.toString()); } } // Destroy the ConsoleHandler - END // Setter and Getter - START public void setOutputStream(OutputStream outParam) { out = outParam; } public void setErrorStream(OutputStream errParam) { err = errParam; } public void setActiveUser(String activeUser) { this.activeUser = activeUser; } public String getActiveUser() { return activeUser; } // Setter and Getter - END }