commit e70c8aca8795467f2e61bfdd3a07c2f14637b449
Author: Nathan Freitas <[email protected]>
Date:   Wed Apr 16 16:21:42 2014 -0400

    add new diagnostics activity for problem childs
---
 res/layout/layout_diag.xml                         |   15 +
 res/menu/share_menu.xml                            |    7 +
 .../android/OrbotDiagnosticsActivity.java          |  305 ++++++++++++++++++++
 3 files changed, 327 insertions(+)

diff --git a/res/layout/layout_diag.xml b/res/layout/layout_diag.xml
new file mode 100644
index 0000000..56cd8bb
--- /dev/null
+++ b/res/layout/layout_diag.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ScrollView android:id="@+id/aboutscrollview" 
+    xmlns:android="http://schemas.android.com/apk/res/android";
+       android:orientation="vertical"
+       android:layout_width="match_parent" 
+       android:layout_height="match_parent">    
+           <TextView 
+               android:id="@+id/diaglog"
+                       android:layout_width="fill_parent" 
+                       android:layout_height="wrap_content"            
+                       android:paddingTop="15px"
+                       android:paddingLeft="15px"
+                       android:textStyle="bold"
+                       android:textColor="#00ff00" />  
+       </ScrollView>                   
diff --git a/res/menu/share_menu.xml b/res/menu/share_menu.xml
new file mode 100644
index 0000000..2352da0
--- /dev/null
+++ b/res/menu/share_menu.xml
@@ -0,0 +1,7 @@
+<menu xmlns:android="http://schemas.android.com/apk/res/android";>
+    <item
+            android:id="@+id/menu_item_share"
+            android:showAsAction="always"
+            android:title="Share Log" />
+   
+</menu>
\ No newline at end of file
diff --git a/src/org/torproject/android/OrbotDiagnosticsActivity.java 
b/src/org/torproject/android/OrbotDiagnosticsActivity.java
new file mode 100644
index 0000000..71eb44f
--- /dev/null
+++ b/src/org/torproject/android/OrbotDiagnosticsActivity.java
@@ -0,0 +1,305 @@
+package org.torproject.android;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+
+import org.sufficientlysecure.rootcommands.Shell;
+import org.sufficientlysecure.rootcommands.Toolbox;
+import org.sufficientlysecure.rootcommands.command.SimpleCommand;
+import org.torproject.android.service.TorResourceInstaller;
+import org.torproject.android.service.TorServiceConstants;
+import org.torproject.android.service.TorServiceUtils;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Environment;
+import android.os.Handler;
+import android.os.Message;
+import android.os.StatFs;
+import android.text.format.Formatter;
+import android.util.Log;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.widget.TextView;
+
+
+public class OrbotDiagnosticsActivity extends Activity {
+
+       private TextView mTextView = null;
+       private final static String TAG = "OrbotDiag";
+       
+       @Override
+       protected void onCreate(Bundle savedInstanceState) { 
+               super.onCreate(savedInstanceState);
+               
+               setContentView(R.layout.layout_diag);
+               
+               mTextView = (TextView)findViewById(R.id.diaglog);
+               
+               log("Hello, Orbot!");
+               
+               log(android.os.Build.DEVICE);
+               log(android.os.Build.HARDWARE);
+               log(android.os.Build.MANUFACTURER);
+               log(android.os.Build.MODEL);
+               log(android.os.Build.VERSION.CODENAME);
+               log(android.os.Build.VERSION.RELEASE);
+               log("freemem: " + Runtime.getRuntime().freeMemory());
+               log("maxmem: " + Runtime.getRuntime().maxMemory());
+               log("storage: " + getFreeStorage());
+       }
+
+       private String getFreeStorage ()
+       {
+               File path = Environment.getDataDirectory();
+               StatFs stat = new StatFs(path.getPath());
+               long blockSize = stat.getBlockSize();
+               long availableBlocks = stat.getAvailableBlocks();
+               return Formatter.formatFileSize(this, availableBlocks * 
blockSize);
+       }
+       
+       @Override
+       protected void onPause() {
+               // TODO Auto-generated method stub
+               super.onPause();
+       }
+
+       @Override
+       protected void onDestroy() {
+
+               super.onDestroy();
+               File appBinHome = this.getDir("bin", Context.MODE_PRIVATE);
+
+               File fileTor= new File(appBinHome, 
TorServiceConstants.TOR_ASSET_KEY);
+                       
+       try {                   
+                       killAllTor (fileTor);
+               } catch (IOException e) {
+                       // TODO Auto-generated catch block
+                       e.printStackTrace();
+               }
+       }
+
+       @Override
+       protected void onResume() {
+               super.onResume();
+
+               showFileTree ();
+               
+               runTorTest();
+       }
+
+       private void killAllTor (File fileTor) throws IOException
+       {
+               int maxTry = 5;
+       int currTry = 0;
+       
+       Shell shell = Shell.startShell();
+       Toolbox tb = new Toolbox(shell);
+       int procId;
+       
+               while ((procId = 
TorServiceUtils.findProcessId(fileTor.getAbsolutePath())) != -1 && currTry++ < 
maxTry)
+               {
+                       
+                       log ("Found existing orphan Tor process; Trying to 
shutdown now (device restart may be needed)...");                    
+                       log("Found Tor PID=" + procId + " - attempt to shutdown 
now...");
+                       
+                       SimpleCommand killCommand = new SimpleCommand("toolbox 
kill -9 " + procId);
+                       shell.add(killCommand);
+                       killCommand = new SimpleCommand("kill -9 " + procId);
+                       shell.add(killCommand);
+               }
+       }
+       
+       private void runTorTest ()
+       {
+               try
+               {
+                       File appBinHome = this.getDir("bin", 
Context.MODE_PRIVATE);
+                       File appDataHome = this.getDir("data", 
Context.MODE_PRIVATE);
+       
+               File fileTor= new File(appBinHome, 
TorServiceConstants.TOR_ASSET_KEY);
+               enableBinExec (fileTor, appBinHome);            
+               killAllTor (fileTor);
+       
+                       InputStream is = 
getResources().openRawResource(R.raw.torrcdiag);
+                       File fileTorrc = new File(appBinHome, 
TorServiceConstants.TORRC_ASSET_KEY + "diag");
+                       TorResourceInstaller.streamToFile(is,fileTorrc, false, 
false);
+               
+                       /**
+                       ArrayList<String> alEnv = new ArrayList<String>();
+                       alEnv.add("HOME=" + appBinHome.getAbsolutePath());
+                       Shell shell = 
Shell.startShell(alEnv,appBinHome.getAbsolutePath());
+                       SimpleCommand cmdTor = new 
SimpleCommand(fileTor.getAbsolutePath() + " DataDirectory " + 
appDataHome.getAbsolutePath() + " -f " + fileTorrc.getAbsolutePath());          
       
+                       shell.add(cmdTor);
+                       **/
+                       
+                       String cmd = fileTor.getAbsolutePath() + " 
DataDirectory " + appDataHome.getAbsolutePath() + " -f " + 
fileTorrc.getAbsolutePath();
+                       
+                       log ("Executing command> " + cmd);
+                       
+                       Process process = Runtime.getRuntime().exec(cmd);
+                       BufferedReader bufferedReader = new BufferedReader(new 
InputStreamReader(process.getInputStream()));
+                       StreamGobbler sg = new StreamGobbler();
+                       sg.reader = bufferedReader;
+                       sg.process = process;
+                       new Thread(sg).start();
+                       
+                       bufferedReader = new BufferedReader(new 
InputStreamReader(process.getErrorStream()));
+                       sg = new StreamGobbler();
+                       sg.reader = bufferedReader;
+                       sg.process = process;
+                       new Thread(sg).start();
+                       
+                       
+               }
+               catch (Exception e)
+               {
+                       Log.d(TAG,"runTorTest exception",e);
+               }
+        
+       }
+       
+       class StreamGobbler implements Runnable
+       {
+               BufferedReader reader;
+               Process process;
+               
+               public void run ()
+               {
+                       String line = null;                     
+                       try {
+                               while ( (line = reader.readLine()) != null)
+                               {
+                                       Message msg = mHandler.obtainMessage(0);
+                                       msg.getData().putString("log", line);
+                                       mHandler.sendMessage(msg);
+                               }
+                               
+                       } catch (IOException e) {
+                               Log.d(TAG, "error reading line",e);
+                       }
+                       
+                       log("Tor exit code=" + process.exitValue() + ";");
+               }
+       }
+       
+        private boolean enableBinExec (File fileBin, File appBinHome) throws 
Exception
+           {
+               
+               log(fileBin.getName() + ": PRE: Is binary exec? " + 
fileBin.canExecute());
+         
+               if (!fileBin.canExecute())
+               {
+                       log("(re)Setting permission on binary: " + 
fileBin.getAbsolutePath());  
+                               Shell shell = Shell.startShell(new 
ArrayList<String>(), appBinHome.getAbsolutePath());
+                       
+                               shell.add(new SimpleCommand("chmod " + 
TorServiceConstants.CHMOD_EXE_VALUE + ' ' + 
fileBin.getAbsolutePath())).waitForFinish();
+                               
+                               File fileTest = new 
File(fileBin.getAbsolutePath());
+                               log(fileTest.getName() + ": POST: Is binary 
exec? " + fileTest.canExecute());
+                               
+                               shell.close();
+               }
+               
+                       return fileBin.canExecute();
+           }
+       
+       private void showFileTree ()
+       {
+               
+               File fileDir = this.getDir("bin", Context.MODE_PRIVATE);
+               log("checking file tree: " + fileDir.getAbsolutePath());
+               printDir (fileDir.getName(), fileDir);
+
+               
+               fileDir = this.getDir("data", Context.MODE_PRIVATE);
+               log("checking file tree: " + fileDir.getAbsolutePath());
+               printDir (fileDir.getName(), fileDir);
+               
+                               
+
+       }
+       
+       private void printDir (String path, File fileDir)
+       {
+               File[] files = fileDir.listFiles();
+               
+               for (File file : files)
+               {
+                       
+                       if (file.isDirectory())
+                       {
+                               printDir(path + '/' + file.getName(), file);
+                       }
+                       else
+                       {
+                               log(path + '/' + file.getName() + " len:" + 
file.length() + " exec:" + file.canExecute());
+                               
+                       }
+               
+               }
+       }
+       
+       Handler mHandler = new Handler ()
+       {
+
+               @Override
+               public void handleMessage(Message msg) {
+               
+                       super.handleMessage(msg);
+                       
+                       String logMsg = msg.getData().getString("log");
+                       log(logMsg);
+               }
+               
+       };
+       
+       private void log (String msg)
+       {
+               Log.d(TAG, msg);
+               mTextView.append(msg + '\n');
+       }
+       
+
+       @Override
+       public boolean onCreateOptionsMenu(Menu menu) {
+           // Inflate menu resource file.
+           getMenuInflater().inflate(R.menu.share_menu, menu);
+       
+           // Locate MenuItem with ShareActionProvider
+           MenuItem item = menu.findItem(R.id.menu_item_share);
+       
+           return true;
+       }
+       
+       @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+           switch (item.getItemId()) {
+       
+           case R.id.menu_item_share:
+               sendLog();
+               return true;
+       
+           default:
+               return super.onOptionsItemSelected(item);
+           }
+    }
+       
+       private void sendLog ()
+       {
+               Intent sendIntent = new Intent();
+               sendIntent.setAction(Intent.ACTION_SEND);
+               sendIntent.putExtra(Intent.EXTRA_TEXT, 
mTextView.getText().toString());
+               sendIntent.setType("text/plain");
+               startActivity(sendIntent);
+       }
+
+
+}



_______________________________________________
tor-commits mailing list
[email protected]
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits

Reply via email to