wpadebug: Add generic control interface command mechanism

Signed-hostap: Jouni Malinen <j@w1.fi>
This commit is contained in:
Jouni Malinen 2013-05-05 02:46:41 +03:00
parent cb54718c50
commit a9008e43e5
6 changed files with 127 additions and 58 deletions

View file

@ -32,5 +32,9 @@
android:label="Command list" android:label="Command list"
android:parentActivityName="w1.fi.wpadebug.MainActivity"> android:parentActivityName="w1.fi.wpadebug.MainActivity">
</activity> </activity>
<activity android:name="w1.fi.wpadebug.WpaCommandListActivity"
android:label="WPA command list"
android:parentActivityName="w1.fi.wpadebug.MainActivity">
</activity>
</application> </application>
</manifest> </manifest>

View file

@ -50,6 +50,9 @@ arbitrary shell commands to be executed. This text file need to be in
example: example:
version@cat /proc/version version@cat /proc/version
Similarly, /data/local/wpadebug.wpacmds can be used to define additional
wpa_supplicant control interface commands.
Uninstallation Uninstallation
-------------- --------------

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical" android:orientation="vertical"
> >
@ -38,36 +38,6 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="wpa_supplicant commands" android:text="wpa_supplicant commands"
/> />
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="status"
android:onClick="wpaStatus"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="PMKSA"
android:onClick="wpaPmksa"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="networks"
android:onClick="wpaListNetworks"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="creds"
android:onClick="wpaListCreds"
/>
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -76,8 +46,8 @@
<Button <Button
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="scanres" android:text="wpa_supplicant commands"
android:onClick="wpaScanResults" android:onClick="runWpaCommands"
/> />
</LinearLayout> </LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

View file

@ -0,0 +1,5 @@
Status@STATUS
PMKSA cache@PMKSA
Networks@LIST_NETWORKS
Creds@LIST_CREDS
Scan results@SCAN_RESULTS

View file

@ -47,6 +47,12 @@ public class MainActivity extends Activity
startActivity(intent); startActivity(intent);
} }
public void runWpaCommands(View view)
{
Intent intent = new Intent(this, WpaCommandListActivity.class);
startActivity(intent);
}
public void runWpaCliCmd(View view) public void runWpaCliCmd(View view)
{ {
Intent intent = new Intent(this, DisplayMessageActivity.class); Intent intent = new Intent(this, DisplayMessageActivity.class);
@ -59,31 +65,6 @@ public class MainActivity extends Activity
wpaCmd(view, cmd); wpaCmd(view, cmd);
} }
public void wpaStatus(View view)
{
wpaCmd(view, "STATUS");
}
public void wpaPmksa(View view)
{
wpaCmd(view, "PMKSA");
}
public void wpaScanResults(View view)
{
wpaCmd(view, "SCAN_RESULTS");
}
public void wpaListNetworks(View view)
{
wpaCmd(view, "LIST_NETWORKS");
}
public void wpaListCreds(View view)
{
wpaCmd(view, "LIST_CREDS");
}
public void wpaLogLevelInfo(View view) public void wpaLogLevelInfo(View view)
{ {
wpaCmd(view, "LOG_LEVEL INFO 1"); wpaCmd(view, "LOG_LEVEL INFO 1");

View file

@ -0,0 +1,106 @@
/*
* wpadebug - wpa_supplicant and Wi-Fi debugging app for Android
* Copyright (c) 2013, Jouni Malinen <j@w1.fi>
*
* This software may be distributed under the terms of the BSD license.
* See README for more details.
*/
package w1.fi.wpadebug;
import java.util.ArrayList;
import java.util.Scanner;
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.io.IOException;
import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Parcelable;
import android.view.View;
import android.widget.ListView;
import android.widget.ArrayAdapter;
import android.widget.Toast;
import android.text.method.ScrollingMovementMethod;
import android.util.Log;
public class WpaCommandListActivity extends ListActivity
{
private static final String TAG = "wpadebug";
private static final String cmdfile = "/data/local/wpadebug.wpacmds";
private void read_commands(ArrayList<CmdList> list, Scanner in)
{
in.useDelimiter("@");
while (in.hasNext()) {
String title = in.next();
String cmd = in.nextLine().substring(1);
list.add(new CmdList(title, cmd));
}
in.close();
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
ArrayList<CmdList> list = new ArrayList<CmdList>();
FileReader in;
try {
in = new FileReader(cmdfile);
read_commands(list, new Scanner(in));
} catch (IOException e) {
Toast.makeText(this, "Could not read " + cmdfile,
Toast.LENGTH_SHORT).show();
}
InputStream inres = getResources().openRawResource(R.raw.wpa_commands);
read_commands(list, new Scanner(inres));
ArrayAdapter<CmdList> listAdapter;
listAdapter = new ArrayAdapter<CmdList>(this, android.R.layout.simple_list_item_1, list);
setListAdapter(listAdapter);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id)
{
CmdList item = (CmdList) getListAdapter().getItem(position);
Toast.makeText(this, "Running: " + item.command,
Toast.LENGTH_SHORT).show();
String message = run(item.command);
if (message == null)
return;
Intent intent = new Intent(this, DisplayMessageActivity.class);
intent.putExtra(MainActivity.EXTRA_MESSAGE, message);
startActivity(intent);
}
private String run(String cmd)
{
try {
Process proc = Runtime.getRuntime().exec(new String[]{"/system/bin/mksh-su", "-c", "wpa_cli " + cmd});
BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
StringBuffer output = new StringBuffer();
int read;
char[] buffer = new char[1024];
while ((read = reader.read(buffer)) > 0)
output.append(buffer, 0, read);
reader.close();
proc.waitFor();
return output.toString();
} catch (IOException e) {
Toast.makeText(this, "Could not run command",
Toast.LENGTH_LONG).show();
return null;
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}