diff options
author | Etan Cohen <etancohen@google.com> | 2017-05-01 11:20:19 -0700 |
---|---|---|
committer | Etan Cohen <etancohen@google.com> | 2017-05-04 22:08:31 -0700 |
commit | 7a76b2468e879e44e546bf2023b8e5cb3e9a0a5f (patch) | |
tree | 5260526ed6df8e773049fe67e87eb6d56d575d26 | |
parent | d6992944c7011c0a68b208dfd042fe61aa48e702 (diff) |
[WIFI] Add adb shell cmd wifi interface
Add hooks for 'adb shell cmd wifi' commands. Replace original
version using dumpsys.
Bug: 37856680
Test: builds and runs
Change-Id: I77295ef910bb1d0414024ea718c139309c585bca
-rw-r--r-- | service/java/com/android/server/wifi/WifiServiceImpl.java | 25 | ||||
-rw-r--r-- | service/java/com/android/server/wifi/WifiShellCommand.java | 109 |
2 files changed, 117 insertions, 17 deletions
diff --git a/service/java/com/android/server/wifi/WifiServiceImpl.java b/service/java/com/android/server/wifi/WifiServiceImpl.java index a018e5a44..73d6b717d 100644 --- a/service/java/com/android/server/wifi/WifiServiceImpl.java +++ b/service/java/com/android/server/wifi/WifiServiceImpl.java @@ -77,6 +77,7 @@ import android.os.PowerManager; import android.os.Process; import android.os.RemoteException; import android.os.ResultReceiver; +import android.os.ShellCallback; import android.os.UserHandle; import android.os.UserManager; import android.os.WorkSource; @@ -131,11 +132,6 @@ public class WifiServiceImpl extends IWifiManager.Stub { private static final String SYSUI_PACKAGE_NAME = "com.android.systemui"; private static final String SETTINGS_PACKAGE_NAME = "com.android.settings"; - // Dumpsys argument to enable/disable disconnect on IP reachability failures. - private static final String DUMP_ARG_SET_IPREACH_DISCONNECT = "set-ipreach-disconnect"; - private static final String DUMP_ARG_SET_IPREACH_DISCONNECT_ENABLED = "enabled"; - private static final String DUMP_ARG_SET_IPREACH_DISCONNECT_DISABLED = "disabled"; - // Default scan background throttling interval if not overriden in settings private static final long DEFAULT_SCAN_BACKGROUND_THROTTLE_INTERVAL_MS = 30 * 60 * 1000; @@ -1859,6 +1855,13 @@ public class WifiServiceImpl extends IWifiManager.Stub { } @Override + public void onShellCommand(FileDescriptor in, FileDescriptor out, FileDescriptor err, + String[] args, ShellCallback callback, ResultReceiver resultReceiver) { + (new WifiShellCommand(mWifiStateMachine)).exec(this, in, out, err, args, callback, + resultReceiver); + } + + @Override protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP) != PackageManager.PERMISSION_GRANTED) { @@ -1876,18 +1879,6 @@ public class WifiServiceImpl extends IWifiManager.Stub { String[] ipManagerArgs = new String[args.length - 1]; System.arraycopy(args, 1, ipManagerArgs, 0, ipManagerArgs.length); mWifiStateMachine.dumpIpManager(fd, pw, ipManagerArgs); - } else if (args != null && args.length > 0 - && DUMP_ARG_SET_IPREACH_DISCONNECT.equals(args[0])) { - if (args.length > 1) { - if (DUMP_ARG_SET_IPREACH_DISCONNECT_ENABLED.equals(args[1])) { - mWifiStateMachine.setIpReachabilityDisconnectEnabled(true); - } else if (DUMP_ARG_SET_IPREACH_DISCONNECT_DISABLED.equals(args[1])) { - mWifiStateMachine.setIpReachabilityDisconnectEnabled(false); - } - } - pw.println("IPREACH_DISCONNECT state is " - + mWifiStateMachine.getIpReachabilityDisconnectEnabled()); - return; } else { pw.println("Wi-Fi is " + mWifiStateMachine.syncGetWifiStateByName()); pw.println("Stay-awake conditions: " + diff --git a/service/java/com/android/server/wifi/WifiShellCommand.java b/service/java/com/android/server/wifi/WifiShellCommand.java new file mode 100644 index 000000000..fc153d1fe --- /dev/null +++ b/service/java/com/android/server/wifi/WifiShellCommand.java @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.wifi; + +import android.app.AppGlobals; +import android.content.pm.IPackageManager; +import android.os.Binder; +import android.os.ShellCommand; + +import java.io.PrintWriter; + +/** + * Interprets and executes 'adb shell cmd wifi [args]'. + * + * To add new commands: + * - onCommand: Add a case "<command>" execute. Return a 0 + * if command executed successfully. + * - onHelp: add a description string. + * + * If additional state objects are necessary add them to the + * constructor. + * + * Permissions: currently root permission is required for all + * commands. If the requirement needs to be relaxed then modify + * the onCommand method to check for specific permissions on + * individual commands. + */ +public class WifiShellCommand extends ShellCommand { + private final WifiStateMachine mStateMachine; + private final IPackageManager mPM; + + WifiShellCommand(WifiStateMachine stateMachine) { + mStateMachine = stateMachine; + mPM = AppGlobals.getPackageManager(); + } + + @Override + public int onCommand(String cmd) { + checkRootPermission(); + + final PrintWriter pw = getOutPrintWriter(); + try { + switch (cmd != null ? cmd : "") { + case "set-ipreach-disconnect": { + boolean enabled; + String nextArg = getNextArgRequired(); + if ("enabled".equals(nextArg)) { + enabled = true; + } else if ("disabled".equals(nextArg)) { + enabled = false; + } else { + pw.println( + "Invalid argument to 'set-ipreach-disconnect' - must be 'enabled'" + + " or 'disabled'"); + return -1; + } + mStateMachine.setIpReachabilityDisconnectEnabled(enabled); + return 0; + } + case "get-ipreach-disconnect": + pw.println("IPREACH_DISCONNECT state is " + + mStateMachine.getIpReachabilityDisconnectEnabled()); + return 0; + default: + return handleDefaultCommands(cmd); + } + } catch (Exception e) { + pw.println("Exception: " + e); + } + return -1; + } + + private void checkRootPermission() { + final int uid = Binder.getCallingUid(); + if (uid == 0) { + // Root can do anything. + return; + } + throw new SecurityException("Uid " + uid + " does not have access to wifi commands"); + } + + @Override + public void onHelp() { + final PrintWriter pw = getOutPrintWriter(); + + pw.println("Wi-Fi (wifi) commands:"); + pw.println(" help"); + pw.println(" Print this help text."); + pw.println(" set-ipreach-disconnect enabled|disabled"); + pw.println(" Sets whether CMD_IP_REACHABILITY_LOST events should trigger disconnects."); + pw.println(" get-ipreach-disconnect"); + pw.println(" Gets setting of CMD_IP_REACHABILITY_LOST events triggering disconnects."); + pw.println(); + } +} |