2 * Created by Tak and Bowon on 17. 7. 21.
\r
3 * SSH class can be used to make ssh connections and send command lines
\r
6 package com.example.lede2;
\r
8 import android.content.Context;
\r
9 import android.util.Log;
\r
10 import android.os.AsyncTask;
\r
12 import com.jcraft.jsch.JSch;
\r
13 import com.jcraft.jsch.JSchException;
\r
14 import com.jcraft.jsch.Session;
\r
15 import com.jcraft.jsch.ChannelExec;
\r
16 import com.jcraft.jsch.Channel;
\r
18 import java.io.IOException;
\r
19 import java.io.InputStream;
\r
20 import java.lang.String;
\r
21 import java.util.ArrayList;
\r
22 import java.util.Arrays;
\r
23 import java.util.List;
\r
25 //import android.provider.Settings;
\r
26 //import android.support.v7.app.AppCompatActivity;
\r
27 //import android.os.Bundle;
\r
28 //import java.io.ByteArrayOutputStream;
\r
29 //import java.util.Properties;
\r
30 //import java.io.PrintStream;
\r
32 // AsyncTask input : command line
\r
33 // AysncTask output : output from a command
\r
34 public class SSH extends AsyncTask<String, Void, List<String>> {
\r
36 // variables used for connection
\r
40 // in this project, we supposed we use fixed host, username, password
\r
45 // host, username, password initialize
\r
47 protected void onPreExecute() {
\r
48 super.onPreExecute();
\r
50 host = ConfigActivity.ROUTERIP;
\r
51 username = ConfigActivity.ROUTERUSER;
\r
52 password = ConfigActivity.RPWD;
\r
56 The functions below are mainly from :
\r
57 https://stackoverflow.com/questions/25789245/how-to-get-jsch-shell-command-output-in-string
\r
61 // open the conenction using username, password, and hostname
\r
62 public boolean open() throws JSchException {
\r
64 JSch jSch = new JSch();
\r
66 session = jSch.getSession(username, host, 22);
\r
67 java.util.Properties config = new java.util.Properties();
\r
68 config.put("StrictHostKeyChecking", "no"); // not recommended
\r
69 session.setPassword(password);
\r
70 session.setConfig(config);
\r
73 Log.d("SSH CONNECT OPEN", "Connecting SSH to " + host + " - Please wait for few seconds... ");
\r
75 if (session.isConnected()) {
\r
76 Log.d("SSH CONNECT", "router connected!");
\r
79 Log.d("SSH NOT CONNECT", "router NOT connected!");
\r
85 public void runCommand(String command) throws JSchException, IOException {
\r
87 if (!session.isConnected())
\r
88 throw new RuntimeException("Not connected to an open session. Call open() first!");
\r
90 channel = session.openChannel("exec");
\r
91 ce = (ChannelExec) channel;
\r
92 ce.setCommand(command);
\r
94 Log.d("SSH RUN COMMAND", command);
\r
97 // get output from a command
\r
98 private List<String> getChannelOutput(Channel channel) throws IOException {
\r
100 byte[] buffer = new byte[1024];
\r
101 List<String> output_lines = new ArrayList<String>();
\r
103 InputStream in = channel.getInputStream();
\r
104 String line = new String();
\r
106 while (in.available() > 0) {
\r
107 int i = in.read(buffer, 0, 1024);
\r
111 line = new String(buffer, 0, i);
\r
112 // add the read line to the return value list.
\r
113 output_lines = new ArrayList(Arrays.asList(line.split("\\n")));
\r
116 if(line.contains("logout")) {
\r
119 if (channel.isClosed()) {
\r
123 Thread.sleep(1000);
\r
124 } catch (Exception ee){}
\r
126 } catch(Exception e) {
\r
127 Log.d("SSH READOUTPUT ERROR", "Error while reading channel output: "+ e);
\r
130 return output_lines;
\r
136 0. params == "-ch <password>" : change default password into <password>
\r
137 1. params == "-co <password>" : add device to the database and hostapd file
\r
138 2. params == "-dn <password>" : delete devices by their names
\r
139 3. params == "-ln <password>" : list devices' names
\r
142 protected List<String> doInBackground(String... params) {
\r
144 List<String> result_lines = new ArrayList<String>();
\r
147 if(params[0].substring(0,3).equals("-ch")) { // ./change_default_pw.sh -ch <password>
\r
148 cmd = MainActivity.DEF_CHANGE_DEFAULT_SCRIPT + " " + params[0];
\r
149 } else if(params[0].substring(0,3).equals("-co")) { // ./connect_device.sh -co <password> <device-name>
\r
150 cmd = MainActivity.DEF_CONNECT_DEVICE_SCRIPT + " " + params[0];
\r
151 } else if(params[0].substring(0,3).equals("-dn")) { // ./register_device.sh -dn <devcie-name>
\r
152 cmd = MainActivity.DEF_REGISTER_DEVICE_SCRIPT + " " + params[0];
\r
153 } else if(params[0].substring(0,3).equals("-ln")) { // ./register_device.sh -ln <devcie-name>
\r
154 // below block is a little different from others cause it needs to get output from the router
\r
156 // try open the connection
\r
158 Log.d("SSH CONNECTION CLOSE", "open failed.");
\r
161 cmd = MainActivity.DEF_REGISTER_DEVICE_SCRIPT + " " + params[0];
\r
163 ce.setCommand(cmd);
\r
165 result_lines = getChannelOutput(ce);
\r
166 } catch (Exception e) {
\r
168 channel.disconnect();
\r
170 // only this block return meaningful value, which should be the names of devices.
\r
171 return result_lines;
\r
173 Log.d("SSH PARAM ERROR", "Wrong parameter used.");
\r
177 // now the command is set, so send it.
\r
179 // try open the connection
\r
181 Log.d("SSH CONNECTION CLOSE", "open failed.");
\r
185 ce.setCommand(cmd);
\r
187 } catch (Exception e) {
\r
190 channel.disconnect();
\r
196 protected onPostExecute(Void param) {
\r
197 Log.d("POST", "in post execute");
\r