SshServlet.java 3.79 KB
package fi.insomnia.bortal.servlet;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import javax.ejb.EJB;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.sshd.SshServer;
import org.apache.sshd.common.Factory;
import org.apache.sshd.server.Command;
import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import fi.insomnia.bortal.beans.EventBeanLocal;
import fi.insomnia.bortal.beans.PermissionBeanLocal;
import fi.insomnia.bortal.clientutils.BortalLocalContextHolder;
import fi.insomnia.bortal.cmdline.Hello;
import fi.insomnia.bortal.model.LanEvent;

/**
 * Servlet implementation class SshServlet
 */
@WebServlet(urlPatterns = "/ssh", loadOnStartup = 10)
public class SshServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private static final Logger logger = LoggerFactory.getLogger(SshServlet.class);
	private Map<Integer, SshServer> servers = new HashMap<Integer, SshServer>();

	// Timeout 30 min
	private static final String TIMEOUT = new Integer(1000 * 60 * 30).toString();

	@EJB
	private EventBeanLocal eventbean;

	@EJB
	private PermissionBeanLocal permBean;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public SshServlet() {
		super();
		// TODO Auto-generated constructor stub
	}

	private class SshShellFactor implements Factory<Command> {

		private BortalLocalContextHolder context;

		public SshShellFactor(BortalLocalContextHolder instance) {
			context = instance;
		}

		@Override
		public Command create() {
			logger.info("creating new bortal command");
			BortalCommand bc = new BortalCommand(context);
			bc
					.addCommandlineCommand("hello", new Hello(permBean))
					.addCommandlineCommand("hallo", new Hello(permBean));

			return bc;
		}
	}

	/**
	 * @see Servlet#init(ServletConfig)
	 */
	public void init(ServletConfig config) throws ServletException {
	}

	private SshServer initSsh(Integer id) {
		logger.info("Initializing ssh servlet");
		SshServer sshd = SshServer.setUpDefaultServer();
		sshd.setPort(8022);
		sshd.getProperties().put(SshServer.IDLE_TIMEOUT, TIMEOUT);

		sshd.setShellFactory(new SshShellFactor(BortalLocalContextHolder.getInstance()));
		BortalPasswordAuthenticator pswdAuth = new BortalPasswordAuthenticator(BortalLocalContextHolder.getInstance());

		sshd.setPasswordAuthenticator(pswdAuth);
		sshd.setKeyPairProvider(new SimpleGeneratorHostKeyProvider("hostkey.ser"));
		try {
			sshd.start();
			return sshd;
		} catch (IOException e) {
			logger.warn("sshd start failed! ", e);
		}
		return null;
	}

	/**
	 * @see Servlet#destroy()
	 */
	public void destroy() {
		logger.info("Destroying ssh servlet");

		for (Entry<Integer, SshServer> entry : servers.entrySet())
		{
			try {
				entry.getValue().stop();
			} catch (InterruptedException e) {
				logger.warn("Error stopping ssh", e);
			}
		}
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		LanEvent event = eventbean.getCurrentEvent();
		if (!servers.containsKey(event.getId())) {
			SshServer ssh = initSsh(event.getId());
			if (ssh != null) {
				servers.put(event.getId(), ssh);
			}
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	}

}