// Copyright 2017 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// This file is meant for debugging use to manually trigger collection of
// debug logs.  Normally this can be done with dbus-send but dbus-send does
// not support passing file descriptors.

#include <stdio.h>
#include <stdlib.h>

#include <memory>

#include <base/command_line.h>
#include <base/files/file_path.h>
#include <base/files/file_util.h>
#include <base/files/scoped_file.h>
#include <base/logging.h>
#include <base/strings/stringprintf.h>
#include <base/time/time.h>
#include <brillo/flag_helper.h>
#include <chromeos/dbus/service_constants.h>
#include <dbus/bus.h>
#include <dbus/message.h>
#include <dbus/object_proxy.h>

namespace {

const char kUsage[] =
    "Developer helper tool for getting extended debug logs from the system."
    "\n"
    "\n"
    "This calls back into debugd using the DumpDebugLogs dbus end point."
    "\n"
    "\n"
    "WARNING: The exact contents of the generated output may vary depending on"
    "\n"
    "developers' whims.";

// Returns a dynamic file name with datestamps in it.
std::string LogName(bool compress) {
  base::Time::Exploded now;
  base::Time::Now().LocalExplode(&now);

  return base::StringPrintf("debug-logs_%04i%02i%02i-%02i%02i%02i.%s", now.year,
                            now.month, now.day_of_month, now.hour, now.minute,
                            now.second, compress ? "tgz" : "tar");
}

}  // namespace

int main(int argc, char* argv[]) {
  DEFINE_bool(compress, true, "Compress the tarball");
  DEFINE_string(output, "", "Where to write the output");
  // Because the logs can be huge, we default the timeout_ms flag to 2 minutes.
  DEFINE_int32(timeout_ms, 120 * 1000,
               "Time (in ms) to gather logs before timeout");
  brillo::FlagHelper::Init(argc, argv, kUsage);

  // Excess arguments may be left around.
  auto args = base::CommandLine::ForCurrentProcess()->GetArgs();
  if (!args.empty()) {
    LOG(ERROR) << "Unexpected arguments (try rerunning with --help):";
    for (const auto& arg : args)
      LOG(ERROR) << arg;
    return EXIT_FAILURE;
  }

  base::FilePath output(FLAGS_output);
  if (output.empty())
    output = base::FilePath{"/tmp/" + LogName(FLAGS_compress)};

  base::ScopedFILE fp(base::OpenFile(output, "w"));
  if (fp == nullptr) {
    PLOG(ERROR) << "Could not write output: " << output.value();
    return EXIT_FAILURE;
  }

  // Set up dbus proxy for talking to debugd.
  dbus::Bus::Options options;
  options.bus_type = dbus::Bus::SYSTEM;
  scoped_refptr<dbus::Bus> bus(new dbus::Bus(options));
  CHECK(bus->Connect());
  dbus::ObjectProxy* debugd_proxy = bus->GetObjectProxy(
      debugd::kDebugdServiceName, dbus::ObjectPath(debugd::kDebugdServicePath));

  // Send request for debug logs.
  dbus::MethodCall method_call(debugd::kDebugdInterface,
                               debugd::kDumpDebugLogs);
  dbus::MessageWriter writer(&method_call);
  writer.AppendBool(FLAGS_compress);
  writer.AppendFileDescriptor(fileno(fp.get()));

  // Wait for the response and process the result.
  LOG(INFO) << "Gathering logs, please wait";
  std::unique_ptr<dbus::Response> response(
      debugd_proxy->CallMethodAndBlock(&method_call, FLAGS_timeout_ms));
  CHECK(response) << debugd::kDumpDebugLogs << " failed";
  LOG(INFO) << "Logs saved to " << output.value();

  return EXIT_SUCCESS;
}
