From: Marius Gavrilescu Date: Tue, 26 Aug 2014 11:39:22 +0000 (+0300) Subject: Add SH and ROOTSH commands X-Git-Tag: 0.000_002~5 X-Git-Url: http://git.ieval.ro/?p=fonbot.git;a=commitdiff_plain;h=251aceaaa3379c65d66a975ff9e7524f7d2f1d73 Add SH and ROOTSH commands --- diff --git a/res/values/strings.xml b/res/values/strings.xml index 887f39c..f72cfd0 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -471,4 +471,14 @@ The help command can be used to get a list of commands and help for them. Exampl Error opening file %1$s (%2$s) File received Reboot failed + + Usage: sh command [arg1 arg2 ...]\n + Executes a shell command and returns its output. FonBot waits for the command to finish, therefore this must not be used with long-running commands.\n + Example: sh ls /sdcard/ + + + Usage: rootsh command [arg1 arg2 ...]\n + Executes a shell command as root and returns its output. FonBot waits for the command to finish, therefore this must not be used with long-running commands. This requires root access.\n + Example: rootsh stop;sleep 3;start + diff --git a/src/ro/ieval/fonbot/Heavy.java b/src/ro/ieval/fonbot/Heavy.java index 4dcd0fc..b1f443c 100644 --- a/src/ro/ieval/fonbot/Heavy.java +++ b/src/ro/ieval/fonbot/Heavy.java @@ -3,11 +3,13 @@ package ro.ieval.fonbot; import static ro.ieval.fonbot.R.string.*; import static ro.ieval.fonbot.Utils.toNonNull; +import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileNotFoundException; import java.io.InputStream; +import java.io.InputStreamReader; import java.io.IOException; import java.io.OutputStream; import java.lang.reflect.InvocationTargetException; @@ -665,6 +667,12 @@ final class Heavy { case TORCH: Utils.sendMessage(context, replyTo, torch_help); break; + case SH: + Utils.sendMessage(context, replyTo, sh_help); + break; + case ROOTSH: + Utils.sendMessage(context, replyTo, rootsh_help); + break; } } @@ -1927,4 +1935,30 @@ final class Heavy { public static void getfile(final Context context, final Address replyTo, final String filename, final String hostname, final int port){ new GetfileExecutableRunnable(context, replyTo, filename, hostname, port).execute(); } + + /** + * Execute a command using a given shell and reply with the output. + * + * @param context Context instance + * @param replyTo reply Address + * @param shell The shell to execute with. Usually sh or su. + * @param command The command to pass to the shell. + */ + public static void execute(final Context context, final Address replyTo, final String shell, final String command) { + try { + final Process proc = Runtime.getRuntime().exec(new String[]{ + shell, + "-c", + command + }); + final BufferedReader br = new BufferedReader (new InputStreamReader(proc.getInputStream())); + String line; + while((line = br.readLine()) != null) + Utils.sendMessage(context, replyTo, line); + proc.waitFor(); + } catch (final Exception e){ + Utils.sendMessage(context, replyTo, error_while_processing_command, e.getClass().getName(), e.getMessage()); + Log.w(Heavy.class.getName(), "Error while processing command", e); + } + } } diff --git a/src/ro/ieval/fonbot/Utils.java b/src/ro/ieval/fonbot/Utils.java index be7923b..e2e0dab 100644 --- a/src/ro/ieval/fonbot/Utils.java +++ b/src/ro/ieval/fonbot/Utils.java @@ -68,7 +68,7 @@ public final class Utils { LS, RM, CONTACTS, DISABLE, ENABLE, POLL, HANGUP, ANSWER, LAUNCH, DATA, GPS, GLOCATION, REBOOT, NOTIFY, SCREENCAP, - TORCH, GETFILE + TORCH, GETFILE, SH, ROOTSH } /** @@ -1009,6 +1009,24 @@ public final class Utils { } Heavy.getfile(context, replyTo, toNonNull(args[0]), toNonNull(args[1]), getfilePort); break; + + case SH: + if(args.length == 0){ + Heavy.help(context, replyTo, toNonNull(Command.SH)); + return; + } + + Heavy.execute(context, replyTo, "sh", join(" ", args)); + break; + + case ROOTSH: + if(args.length == 0){ + Heavy.help(context, replyTo, toNonNull(Command.ROOTSH)); + return; + } + + Heavy.execute(context, replyTo, "su", join(" ", args)); + break; } }