BortalCommand.java 3.82 KB
package fi.insomnia.bortal.servlet;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.nio.charset.Charset;
import java.util.HashMap;

import javax.annotation.PostConstruct;
import javax.security.auth.login.LoginException;

import org.apache.sshd.server.Command;
import org.apache.sshd.server.Environment;
import org.apache.sshd.server.ExitCallback;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import fi.insomnia.bortal.clientutils.BortalLocalContextHolder;
import fi.insomnia.bortal.cmdline.Hello;
import fi.insomnia.bortal.cmdline.ICommandlineCommand;

public class BortalCommand implements Command, Runnable {

	private static Logger logger = LoggerFactory.getLogger(BortalCommand.class);
	private OutputStreamWriter errstream;
	private ExitCallback exitCallback;
	private InputStreamReader instream;
	private OutputStreamWriter outstream;
	private BortalLocalContextHolder contextHolder;
	private Charset UTF8 = Charset.forName("UTF-8");
	
	private HashMap<String, ICommandlineCommand> commandMap = new HashMap<String, ICommandlineCommand>();

	public BortalCommand(BortalLocalContextHolder context) {
		contextHolder = context;
	}
	
	public BortalCommand addCommandlineCommand(String name, ICommandlineCommand c) {
		this.commandMap.put(name, c);
		return this;
	}

	@Override
	public void setInputStream(InputStream in) {
		instream = new InputStreamReader(in, UTF8);

	}

	@Override
	public void setOutputStream(OutputStream out) {
		outstream = new OutputStreamWriter(out, UTF8);
	}

	@Override
	public void setErrorStream(OutputStream err) {
		errstream = new OutputStreamWriter(err, UTF8);
	}

	@Override
	public void setExitCallback(ExitCallback callback) {
		exitCallback = callback;
	}

	@Override
	public void start(Environment env) throws IOException {
		logger.info("Starting something...");
		new Thread(this).start();
	}

	@Override
	public void destroy() {
		logger.info("destroying ssh command");
	}

	@Override
	public void run() {
		BortalLocalContextHolder.copy(contextHolder);
		BortalLocalContextHolder.getInstance().executeLogin();
		
		try {
			logger.info("Created new bortalCommane");
			outstream.write("Hello you...");
			StringBuilder cmdBuilder = new StringBuilder();
			
			// prime 0 return value
			int returnValue = 0;
			while (true) {

				if (!instream.ready()) {
					Thread.sleep(100);
				} else {
					char inchar = (char) instream.read();

					if (inchar == '\n' || inchar == '\r')
					{
						outstream.write("\r\n");
						outstream.flush();
						returnValue = parseCommand(cmdBuilder.toString());
						
						outstream.write("[" + returnValue + "] " + BortalLocalContextHolder.getInstance().getLoginContext().getSubject().getPrincipals().iterator().next().getName() + " # ");
						outstream.flush();

						cmdBuilder = new StringBuilder();

					}
					else {
						outstream.write(inchar);
						outstream.flush();
						cmdBuilder.append(inchar);
					}
				}
			}

		} catch (InterruptedException e) {
			logger.warn("Running command interrupted", e);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		BortalLocalContextHolder.getInstance().executeLogout();
		exitCallback.onExit(3);
	}

	private int parseCommand(String args) {
		String[] argv = null;
		if(args != null) {
			if(args.length() == 0) return 0;
			argv = args.split(" ");
		}
		
		if(argv != null && argv.length > 0) {
			logger.info("received command {}", argv[0]);
			ICommandlineCommand cmd;
			if((cmd = this.commandMap.get(argv[0])) != null) {
				return cmd.execute(argv,this.instream, this.outstream, this.errstream);
			} else {
				try {
					this.errstream.write("unknown command\r\n");
					this.errstream.flush();
				} catch(IOException ioe) {}

				return -1;
			}
		} else {
			return 0;
		}
	}
}