blob: 31ca289911993cb1ab9205d26a72e6ad6c10200b [file] [log] [blame]
// Copyright (c) 2012 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.
#include "debugd/src/debug_logs_tool.h"
#include <base/files/file_util.h>
#include <base/files/scoped_temp_dir.h>
#include <base/logging.h>
#include <brillo/process.h>
namespace debugd {
namespace {
constexpr char kCat[] = "/bin/cat";
constexpr char kArcBugreportPipe[] = "/run/arc/bugreport/pipe";
constexpr char kArcBugreportFile[] = "arc-bugreport.txt";
constexpr char kTar[] = "/bin/tar";
constexpr char kSystemLogs[] = "/var/log";
// Executes 'bugreport' command in the container through the pipe, then writes
// the output to |arc_bugreport_file|. When the container is not running,
// the function returns immediately without writing anything.
void WriteArcBugreport(const base::FilePath& arc_bugreport_file) {
brillo::ProcessImpl p;
p.AddArg(kCat);
p.AddArg(kArcBugreportPipe);
p.RedirectOutput(arc_bugreport_file.value());
p.Run();
}
} // namespace
void DebugLogsTool::GetDebugLogs(bool is_compressed,
const dbus::FileDescriptor& fd) {
base::ScopedTempDir arc_temp_dir;
// Create a temporary file and write ARC log to the file if ARC is running.
if (base::PathExists(base::FilePath(kArcBugreportPipe))) {
if (arc_temp_dir.CreateUniqueTempDir())
WriteArcBugreport(arc_temp_dir.path().Append(kArcBugreportFile));
else
PLOG(WARNING) << "Failed to create a temporary directory";
}
brillo::ProcessImpl p;
p.AddArg(kTar);
p.AddArg("-c");
if (is_compressed)
p.AddArg("-z");
if (arc_temp_dir.IsValid()) {
p.AddArg("-C");
p.AddArg(arc_temp_dir.path().value());
p.AddArg(kArcBugreportFile);
}
p.AddArg(kSystemLogs);
p.BindFd(fd.value(), STDOUT_FILENO);
p.Run();
}
} // namespace debugd