BortalCommand.java
3.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
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;
}
}
}