Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 06c2f8e3 authored by Neil Fuller's avatar Neil Fuller Committed by android-build-merger
Browse files

Merge "Add dumpsys support to RulesManagerService"

am: 348a1d63

Change-Id: Ib1b44ce174b625f2223dff72081ccfc7b2a9b390
parents b87cf12a 348a1d63
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -125,4 +125,8 @@ public final class DistroRulesVersion implements Parcelable {
                + ", mRevision='" + mRevision + '\''
                + '}';
    }

    public String toDumpString() {
        return mRulesVersion + "," + mRevision;
    }
}
+5 −0
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.text.ParseException;
import java.io.PrintWriter;

import static com.android.server.timezone.PackageStatus.CHECK_COMPLETED_FAILURE;
import static com.android.server.timezone.PackageStatus.CHECK_COMPLETED_SUCCESS;
@@ -375,4 +376,8 @@ final class PackageStatusStorage {
        }
        return value;
    }

    public void dump(PrintWriter printWriter) {
        printWriter.println("Package status: " + getPackageStatus());
    }
}
+20 −0
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import android.provider.TimeZoneRulesDataContract;
import android.util.Slog;

import java.io.File;
import java.io.PrintWriter;

/**
 * Monitors the installed applications associated with time zone updates. If the app packages are
@@ -510,4 +511,23 @@ public class PackageTracker implements IntentHelper.Listener {
        Slog.wtf(TAG, message, cause);
        throw new RuntimeException(message, cause);
    }

    public void dump(PrintWriter fout) {
        fout.println("PackageTrackerState: " + toString());
        mPackageStatusStorage.dump(fout);
    }

    @Override
    public String toString() {
        return "PackageTracker{" +
                "mTrackingEnabled=" + mTrackingEnabled +
                ", mUpdateAppPackageName='" + mUpdateAppPackageName + '\'' +
                ", mDataAppPackageName='" + mDataAppPackageName + '\'' +
                ", mCheckTimeAllowedMillis=" + mCheckTimeAllowedMillis +
                ", mFailedCheckRetryCount=" + mFailedCheckRetryCount +
                ", mLastTriggerTimestamp=" + mLastTriggerTimestamp +
                ", mCheckTriggered=" + mCheckTriggered +
                ", mCheckFailureCount=" + mCheckFailureCount +
                '}';
    }
}
+4 −0
Original line number Diff line number Diff line
@@ -16,10 +16,14 @@

package com.android.server.timezone;

import java.io.PrintWriter;

/**
 * An easy-to-mock interface around permission checks for use by {@link RulesManagerService}.
 */
public interface PermissionHelper {

    void enforceCallerHasPermission(String requiredPermission) throws SecurityException;

    boolean checkDumpPermission(String tag, PrintWriter printWriter);
}
+131 −7
Original line number Diff line number Diff line
@@ -37,12 +37,24 @@ import android.os.RemoteException;
import android.util.Slog;

import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicBoolean;
import libcore.icu.ICU;
import libcore.util.ZoneInfoDB;

import static android.app.timezone.RulesState.DISTRO_STATUS_INSTALLED;
import static android.app.timezone.RulesState.DISTRO_STATUS_NONE;
import static android.app.timezone.RulesState.DISTRO_STATUS_UNKNOWN;
import static android.app.timezone.RulesState.STAGED_OPERATION_INSTALL;
import static android.app.timezone.RulesState.STAGED_OPERATION_NONE;
import static android.app.timezone.RulesState.STAGED_OPERATION_UNINSTALL;
import static android.app.timezone.RulesState.STAGED_OPERATION_UNKNOWN;

// TODO(nfuller) Add EventLog calls where useful in the system server.
// TODO(nfuller) Check logging best practices in the system server.
@@ -113,6 +125,11 @@ public final class RulesManagerService extends IRulesManager.Stub {
    public RulesState getRulesState() {
        mPermissionHelper.enforceCallerHasPermission(REQUIRED_UPDATER_PERMISSION);

        return getRulesStateInternal();
    }

    /** Like {@link #getRulesState()} without the permission check. */
    private RulesState getRulesStateInternal() {
        synchronized(this) {
            String systemRulesVersion;
            try {
@@ -126,18 +143,18 @@ public final class RulesManagerService extends IRulesManager.Stub {

            // Determine the staged operation status, if possible.
            DistroRulesVersion stagedDistroRulesVersion = null;
            int stagedOperationStatus = RulesState.STAGED_OPERATION_UNKNOWN;
            int stagedOperationStatus = STAGED_OPERATION_UNKNOWN;
            if (!operationInProgress) {
                StagedDistroOperation stagedDistroOperation;
                try {
                    stagedDistroOperation = mInstaller.getStagedDistroOperation();
                    if (stagedDistroOperation == null) {
                        stagedOperationStatus = RulesState.STAGED_OPERATION_NONE;
                        stagedOperationStatus = STAGED_OPERATION_NONE;
                    } else if (stagedDistroOperation.isUninstall) {
                        stagedOperationStatus = RulesState.STAGED_OPERATION_UNINSTALL;
                        stagedOperationStatus = STAGED_OPERATION_UNINSTALL;
                    } else {
                        // Must be an install.
                        stagedOperationStatus = RulesState.STAGED_OPERATION_INSTALL;
                        stagedOperationStatus = STAGED_OPERATION_INSTALL;
                        DistroVersion stagedDistroVersion = stagedDistroOperation.distroVersion;
                        stagedDistroRulesVersion = new DistroRulesVersion(
                                stagedDistroVersion.rulesVersion,
@@ -150,16 +167,16 @@ public final class RulesManagerService extends IRulesManager.Stub {

            // Determine the installed distro state, if possible.
            DistroVersion installedDistroVersion;
            int distroStatus = RulesState.DISTRO_STATUS_UNKNOWN;
            int distroStatus = DISTRO_STATUS_UNKNOWN;
            DistroRulesVersion installedDistroRulesVersion = null;
            if (!operationInProgress) {
                try {
                    installedDistroVersion = mInstaller.getInstalledDistroVersion();
                    if (installedDistroVersion == null) {
                        distroStatus = RulesState.DISTRO_STATUS_NONE;
                        distroStatus = DISTRO_STATUS_NONE;
                        installedDistroRulesVersion = null;
                    } else {
                        distroStatus = RulesState.DISTRO_STATUS_INSTALLED;
                        distroStatus = DISTRO_STATUS_INSTALLED;
                        installedDistroRulesVersion = new DistroRulesVersion(
                                installedDistroVersion.rulesVersion,
                                installedDistroVersion.revision);
@@ -358,6 +375,87 @@ public final class RulesManagerService extends IRulesManager.Stub {
        mPackageTracker.recordCheckResult(checkToken, success);
    }

    @Override
    protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
        if (!mPermissionHelper.checkDumpPermission(TAG, pw)) {
            return;
        }

        RulesState rulesState = getRulesStateInternal();
        if (args != null && args.length == 2) {
            // Formatting options used for automated tests. The format is less free-form than
            // the -format options, which are intended to be easier to parse.
            if ("-format_state".equals(args[0]) && args[1] != null) {
                for (char c : args[1].toCharArray()) {
                    switch (c) {
                        case 'p': // Report operation in progress
                            pw.println("Operation in progress: "
                                    + rulesState.isOperationInProgress());
                            break;
                        case 's': // Report system image rules version
                            pw.println("System rules version: "
                                    + rulesState.getSystemRulesVersion());
                            break;
                        case 'c': // Report current installation state
                            pw.println("Current install state: "
                                    + distroStatusToString(rulesState.getDistroStatus()));
                            break;
                        case 'i': // Report currently installed version
                            DistroRulesVersion installedRulesVersion =
                                    rulesState.getInstalledDistroRulesVersion();
                            pw.print("Installed rules version: ");
                            if (installedRulesVersion == null) {
                                pw.println("<None>");
                            } else {
                                pw.println(installedRulesVersion.toDumpString());
                            }
                            break;
                        case 'o': // Report staged operation type
                            int stagedOperationType = rulesState.getStagedOperationType();
                            pw.println("Staged operation: "
                                    + stagedOperationToString(stagedOperationType));
                            break;
                        case 't':
                            // Report staged version (i.e. the one that will be installed next boot
                            // if the staged operation is an install).
                            pw.print("Staged rules version: ");
                            DistroRulesVersion stagedDistroRulesVersion =
                                    rulesState.getStagedDistroRulesVersion();
                            if (stagedDistroRulesVersion == null) {
                                pw.println("<None>");
                            } else {
                                pw.println("Staged install version: "
                                        + stagedDistroRulesVersion.toDumpString());
                            }
                            break;
                        case 'a':
                            // Report the active rules version (i.e. the rules in use by the current
                            // process).
                            pw.println("Active rules version (ICU, libcore): "
                                    + ICU.getTZDataVersion() + ","
                                    + ZoneInfoDB.getInstance().getVersion());
                            break;
                        default:
                            pw.println("Unknown option: " + c);
                    }
                }
                return;
            }
        }

        pw.println("RulesManagerService state: " + toString());
        pw.println("Active rules version (ICU, libcore): " + ICU.getTZDataVersion() + ","
                + ZoneInfoDB.getInstance().getVersion());
        mPackageTracker.dump(pw);
    }

    @Override
    public String toString() {
        return "RulesManagerService{" +
                "mOperationInProgress=" + mOperationInProgress +
                '}';
    }

    private static CheckToken createCheckTokenOrThrow(byte[] checkTokenBytes) {
        CheckToken checkToken;
        try {
@@ -368,4 +466,30 @@ public final class RulesManagerService extends IRulesManager.Stub {
        }
        return checkToken;
    }

    private static String distroStatusToString(int distroStatus) {
        switch(distroStatus) {
            case DISTRO_STATUS_NONE:
                return "None";
            case DISTRO_STATUS_INSTALLED:
                return "Installed";
            case DISTRO_STATUS_UNKNOWN:
            default:
                return "Unknown";
        }
    }

    private static String stagedOperationToString(int stagedOperationType) {
        switch(stagedOperationType) {
            case STAGED_OPERATION_NONE:
                return "None";
            case STAGED_OPERATION_UNINSTALL:
                return "Uninstall";
            case STAGED_OPERATION_INSTALL:
                return "Install";
            case STAGED_OPERATION_UNKNOWN:
            default:
                return "Unknown";
        }
    }
}
Loading