Initial commit.
This commit is contained in:
128
src/main/java/com/ryanmichela/sshd/ConsoleShellFactory.java
Normal file
128
src/main/java/com/ryanmichela/sshd/ConsoleShellFactory.java
Normal file
@@ -0,0 +1,128 @@
|
||||
package com.ryanmichela.sshd;
|
||||
|
||||
import org.apache.sshd.common.Factory;
|
||||
import org.apache.sshd.server.Command;
|
||||
import org.apache.sshd.server.Environment;
|
||||
import org.apache.sshd.server.ExitCallback;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.craftbukkit.libs.jline.console.ConsoleReader;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.util.logging.Formatter;
|
||||
import java.util.logging.Logger;
|
||||
import java.util.logging.StreamHandler;
|
||||
|
||||
public class ConsoleShellFactory implements Factory<Command> {
|
||||
|
||||
public Command create() {
|
||||
return new ConsoleShell();
|
||||
}
|
||||
|
||||
public static class ConsoleShell implements Command, Runnable {
|
||||
|
||||
private InputStream in;
|
||||
private OutputStream out;
|
||||
private OutputStream err;
|
||||
private ExitCallback callback;
|
||||
private Environment environment;
|
||||
private Thread thread;
|
||||
|
||||
StreamHandler streamHandler;
|
||||
ConsoleReader consoleReader;
|
||||
|
||||
public InputStream getIn() {
|
||||
return in;
|
||||
}
|
||||
|
||||
public OutputStream getOut() {
|
||||
return out;
|
||||
}
|
||||
|
||||
public OutputStream getErr() {
|
||||
return err;
|
||||
}
|
||||
|
||||
public Environment getEnvironment() {
|
||||
return environment;
|
||||
}
|
||||
|
||||
public void setInputStream(InputStream in) {
|
||||
this.in = in;
|
||||
}
|
||||
|
||||
public void setOutputStream(OutputStream out) {
|
||||
this.out = out;
|
||||
}
|
||||
|
||||
public void setErrorStream(OutputStream err) {
|
||||
this.err = err;
|
||||
}
|
||||
|
||||
public void setExitCallback(ExitCallback callback) {
|
||||
this.callback = callback;
|
||||
}
|
||||
|
||||
public void start(Environment env) throws IOException {
|
||||
|
||||
Formatter bukkitFormatter = Bukkit.getLogger().getHandlers()[0].getFormatter();
|
||||
|
||||
try {
|
||||
consoleReader = new ConsoleReader(in, new FlushyOutputStream(out), new SshTerminal());
|
||||
consoleReader.setExpandEvents(true);
|
||||
consoleReader.addCompleter(new ConsoleCommandCompleter());
|
||||
|
||||
streamHandler = new FlushyStreamHandler(out, bukkitFormatter, consoleReader);
|
||||
Bukkit.getLogger().addHandler(streamHandler);
|
||||
Logger.getLogger("").addHandler(streamHandler);
|
||||
|
||||
environment = env;
|
||||
thread = new Thread(this, "EchoShell " + env.getEnv().get(Environment.ENV_USER));
|
||||
thread.start();
|
||||
} catch (Exception e) {
|
||||
throw new IOException("Error starting shell", e);
|
||||
}
|
||||
}
|
||||
|
||||
public void destroy() {
|
||||
Bukkit.getLogger().removeHandler(streamHandler);
|
||||
Logger.getLogger("").removeHandler(streamHandler);
|
||||
}
|
||||
|
||||
public void run() {
|
||||
String command;
|
||||
try {
|
||||
printPreamble(consoleReader);
|
||||
while(true) {
|
||||
command = consoleReader.readLine("\r>", null);
|
||||
if (command != null) {
|
||||
if (command.equals("exit")) {
|
||||
break;
|
||||
}
|
||||
SshdPlugin.instance.getLogger().info("[U: " + environment.getEnv().get(Environment.ENV_USER) + "] " + command);
|
||||
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), command);
|
||||
}
|
||||
}
|
||||
} catch (IOException e) {
|
||||
SshdPlugin.instance.getLogger().severe("Error processing command from SSH");
|
||||
} finally {
|
||||
callback.onExit(0);
|
||||
}
|
||||
}
|
||||
|
||||
private void printPreamble(ConsoleReader consoleReader) throws IOException{
|
||||
consoleReader.println(" _____ _____ _ _ _____");
|
||||
consoleReader.println(" / ____/ ____| | | | __ \\");
|
||||
consoleReader.println("| (___| (___ | |__| | | | |");
|
||||
consoleReader.println(" \\___ \\\\___ \\| __ | | | |");
|
||||
consoleReader.println(" ____) |___) | | | | |__| |");
|
||||
consoleReader.println("|_____/_____/|_| |_|_____/");
|
||||
consoleReader.println("Connected to: " + Bukkit.getServer().getName());
|
||||
consoleReader.println("- " + Bukkit.getServer().getMotd());
|
||||
consoleReader.println();
|
||||
consoleReader.println("Type 'exit' to exit the shell.");
|
||||
consoleReader.println("===============================================");
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user