Checking in LEDE GUI for device registration; this was ported from the implementation...
[iot2.git] / others / lede-gui / src / main / java / com / example / lede2 / SSH.java
1 /**\r
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
4  */\r
5 \r
6 package com.example.lede2;\r
7 \r
8 import android.content.Context;\r
9 import android.util.Log;\r
10 import android.os.AsyncTask;\r
11 \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
17 \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
24 \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
31 \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
35 \r
36         // variables used for connection\r
37         Session session;\r
38         Channel channel;\r
39         ChannelExec ce;\r
40         // in this project, we supposed we use fixed host, username, password\r
41         String host;\r
42         String username;\r
43         String password;\r
44 \r
45         // host, username, password initialize\r
46         @Override\r
47         protected void onPreExecute() {\r
48                 super.onPreExecute();\r
49 \r
50                 host = ConfigActivity.ROUTERIP;\r
51                 username = ConfigActivity.ROUTERUSER;\r
52                 password = ConfigActivity.RPWD;\r
53         }\r
54 \r
55         /* \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
58         */\r
59 \r
60 \r
61         // open the conenction using username, password, and hostname\r
62         public boolean open() throws JSchException {\r
63 \r
64                 JSch jSch = new JSch();\r
65 \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
71 \r
72 \r
73                 Log.d("SSH CONNECT OPEN", "Connecting SSH to " + host + " - Please wait for few seconds... ");\r
74                 session.connect();\r
75                 if (session.isConnected()) {\r
76                         Log.d("SSH CONNECT", "router connected!");\r
77                         return true;\r
78                 } else {\r
79                         Log.d("SSH NOT CONNECT", "router NOT connected!");\r
80                         return false;\r
81                 }\r
82         }\r
83 \r
84         // send a command\r
85         public void runCommand(String command) throws JSchException, IOException {\r
86 \r
87                 if (!session.isConnected())\r
88                         throw new RuntimeException("Not connected to an open session.  Call open() first!");\r
89 \r
90                 channel = session.openChannel("exec");\r
91                 ce = (ChannelExec) channel;\r
92                 ce.setCommand(command);\r
93                 ce.connect();\r
94                 Log.d("SSH RUN COMMAND", command);\r
95         }\r
96 \r
97         // get output from a command\r
98         private List<String> getChannelOutput(Channel channel) throws IOException {\r
99 \r
100                 byte[] buffer = new byte[1024];\r
101                 List<String> output_lines = new ArrayList<String>();\r
102                 try {\r
103                         InputStream in = channel.getInputStream();\r
104                         String line = new String();\r
105                         while (true) {\r
106                                 while (in.available() > 0) {\r
107                                         int i = in.read(buffer, 0, 1024);\r
108                                         if (i < 0) {\r
109                                                 break;\r
110                                         }\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
114                                 }\r
115 \r
116                                 if(line.contains("logout")) {\r
117                                         break;\r
118                                 }\r
119                                 if (channel.isClosed()) {\r
120                                         break;\r
121                                 }\r
122                                 try {\r
123                                         Thread.sleep(1000);\r
124                                 } catch (Exception ee){}\r
125                         }\r
126                 } catch(Exception e) {\r
127                         Log.d("SSH READOUTPUT ERROR", "Error while reading channel output: "+ e);\r
128                 }\r
129 \r
130                 return output_lines;\r
131         }\r
132 \r
133 \r
134         /*\r
135         usage :\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
140         */\r
141         @Override\r
142         protected List<String> doInBackground(String... params) {\r
143 \r
144                 List<String> result_lines = new ArrayList<String>();\r
145                 String cmd;\r
146 \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
155                         try {\r
156                                 // try open the connection\r
157                                 if (!open()) {\r
158                                         Log.d("SSH CONNECTION CLOSE", "open failed.");\r
159                                         return null;\r
160                                 }\r
161                                 cmd = MainActivity.DEF_REGISTER_DEVICE_SCRIPT + " " + params[0];\r
162                                 runCommand(cmd);\r
163                                 ce.setCommand(cmd);\r
164                                 ce.connect();\r
165                                 result_lines = getChannelOutput(ce);\r
166                         } catch (Exception e) {\r
167                         }\r
168                         channel.disconnect();\r
169 \r
170                         // only this block return meaningful value, which should be the names of devices.\r
171                         return result_lines;\r
172                 } else {\r
173                         Log.d("SSH PARAM ERROR", "Wrong parameter used.");\r
174                         return null;\r
175                 }\r
176 \r
177                 // now the command is set, so send it.\r
178                 try {\r
179                         // try open the connection\r
180                         if (!open()) {\r
181                                 Log.d("SSH CONNECTION CLOSE", "open failed.");\r
182                                 return null;\r
183                         }\r
184                         runCommand(cmd);\r
185                         ce.setCommand(cmd);\r
186                         ce.connect();\r
187                 } catch (Exception e) {\r
188                 } // done\r
189 \r
190                 channel.disconnect();\r
191                 return null;\r
192         }\r
193 \r
194         /*\r
195         @Override\r
196         protected  onPostExecute(Void param) {\r
197                 Log.d("POST", "in post execute");\r
198         }\r
199         */\r
200 }\r