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

Commit c19b08a6 authored by Yifan Hong's avatar Yifan Hong Committed by Gerrit Code Review
Browse files

Merge "Make snapshotctl logging better."

parents b34a7294 12fe03d4
Loading
Loading
Loading
Loading
+60 −12
Original line number Diff line number Diff line
@@ -19,9 +19,13 @@
#include <chrono>
#include <iostream>
#include <map>
#include <sstream>

#include <android-base/file.h>
#include <android-base/logging.h>
#include <android-base/unique_fd.h>
#include <libsnapshot/snapshot.h>
#include "utility.h"

using namespace std::string_literals;

@@ -31,9 +35,11 @@ int Usage() {
                 "Actions:\n"
                 "  dump\n"
                 "    Print snapshot states.\n"
                 "  merge [--logcat]\n"
                 "  merge [--logcat] [--log-to-file]\n"
                 "    Initialize merge and wait for it to be completed.\n"
                 "    If --logcat is specified, log to logcat. Otherwise, log to stdout.\n";
                 "    If --logcat is specified, log to logcat.\n"
                 "    If --log-to-file is specified, log to /data/misc/snapshotctl_log/.\n"
                 "    If both specified, log to both. If none specified, log to stdout.\n";
    return EX_USAGE;
}

@@ -45,20 +51,62 @@ bool DumpCmdHandler(int /*argc*/, char** argv) {
    return SnapshotManager::New()->Dump(std::cout);
}

bool MergeCmdHandler(int argc, char** argv) {
    auto begin = std::chrono::steady_clock::now();
class FileLogger {
  public:
    FileLogger() {
        static constexpr const char* kLogFilePath = "/data/misc/snapshotctl_log/";
        std::stringstream ss;
        ss << kLogFilePath << "snapshotctl." << Now() << ".log";
        fd_.reset(TEMP_FAILURE_RETRY(
                open(ss.str().c_str(),
                     O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC | O_NOFOLLOW | O_SYNC, 0660)));
    }
    // Copy-contuctor needed to be converted to std::function.
    FileLogger(const FileLogger& other) { fd_.reset(dup(other.fd_)); }
    void operator()(android::base::LogId, android::base::LogSeverity, const char* /*tag*/,
                    const char* /*file*/, unsigned int /*line*/, const char* message) {
        if (fd_ == -1) return;
        std::stringstream ss;
        ss << Now() << ":" << message << "\n";
        (void)android::base::WriteStringToFd(ss.str(), fd_);
    }

    bool log_to_logcat = false;
    for (int i = 2; i < argc; ++i) {
  private:
    android::base::unique_fd fd_;
};

class MergeCmdLogger {
  public:
    MergeCmdLogger(int argc, char** argv) {
        for (int i = 0; i < argc; ++i) {
            if (argv[i] == "--logcat"s) {
            log_to_logcat = true;
                loggers_.push_back(android::base::LogdLogger());
            }
            if (argv[i] == "--log-to-file"s) {
                loggers_.push_back(std::move(FileLogger()));
            }
        }
        if (loggers_.empty()) {
            loggers_.push_back(&android::base::StdioLogger);
        }
    if (log_to_logcat) {
        android::base::InitLogging(argv);
    } else {
        android::base::InitLogging(argv, &android::base::StdioLogger);
    }
    void operator()(android::base::LogId id, android::base::LogSeverity severity, const char* tag,
                    const char* file, unsigned int line, const char* message) {
        for (auto&& logger : loggers_) {
            logger(id, severity, tag, file, line, message);
        }
    }

  private:
    std::vector<android::base::LogFunction> loggers_;
};

bool MergeCmdHandler(int argc, char** argv) {
    auto begin = std::chrono::steady_clock::now();

    // 'snapshotctl merge' is stripped away from arguments to
    // Logger.
    android::base::InitLogging(argv, MergeCmdLogger(argc - 2, argv + 2));

    auto state = SnapshotManager::New()->InitiateMergeAndWait();

+1 −1
Original line number Diff line number Diff line
on property:sys.boot_completed=1
    exec_background - root root -- /system/bin/snapshotctl merge --logcat
    exec_background - root root -- /system/bin/snapshotctl merge --logcat --log-to-file
+11 −0
Original line number Diff line number Diff line
@@ -15,6 +15,10 @@
#include "utility.h"

#include <errno.h>
#include <time.h>

#include <iomanip>
#include <sstream>

#include <android-base/file.h>
#include <android-base/logging.h>
@@ -155,5 +159,12 @@ bool WriteStringToFileAtomic(const std::string& content, const std::string& path
    return true;
}

std::ostream& operator<<(std::ostream& os, const Now&) {
    struct tm now;
    time_t t = time(nullptr);
    localtime_r(&t, &now);
    return os << std::put_time(&now, "%Y%m%d-%H%M%S");
}

}  // namespace snapshot
}  // namespace android
+5 −0
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@
#pragma once

#include <functional>
#include <iostream>
#include <string>

#include <android-base/macros.h>
@@ -120,5 +121,9 @@ Return InitializeCow(const std::string& device);
// is an open fd to |path|, because that fd has an old view of the file.
bool WriteStringToFileAtomic(const std::string& content, const std::string& path);

// Writes current time to a given stream.
struct Now {};
std::ostream& operator<<(std::ostream& os, const Now&);

}  // namespace snapshot
}  // namespace android
+1 −0
Original line number Diff line number Diff line
@@ -613,6 +613,7 @@ on post-fs-data
    mkdir /data/misc/installd 0700 root root
    mkdir /data/misc/apexdata 0711 root root
    mkdir /data/misc/apexrollback 0700 root root
    mkdir /data/misc/snapshotctl_log 0770 root root

    mkdir /data/preloads 0775 system system encryption=None