blob: dc8c04266e8a478d8b5490e539b3405bc4509966 [file] [log] [blame]
Elly Jones0b6bd182012-02-14 18:24:22 -05001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Brian Norrisca4fc042018-04-03 00:24:26 -07005#include <string>
6
Alex Vakulenko262be3f2014-07-30 15:25:50 -07007#include "debugd/src/debug_logs_tool.h"
Brian Norrisca4fc042018-04-03 00:24:26 -07008#include "debugd/src/log_tool.h"
Elly Jones0b6bd182012-02-14 18:24:22 -05009
Ben Chancd8fda42014-09-05 08:21:06 -070010#include <base/files/file_util.h>
Yusuke Sato39acf512016-10-17 21:57:00 -070011#include <base/files/scoped_temp_dir.h>
12#include <base/logging.h>
Simon Glass2b1da092020-05-21 12:24:16 -060013#include <brillo/process/process.h>
Elly Jones0b6bd182012-02-14 18:24:22 -050014
15namespace debugd {
16
Yusuke Sato39acf512016-10-17 21:57:00 -070017namespace {
18
Brian Norrisca4fc042018-04-03 00:24:26 -070019constexpr char kFeedbackLogsDir[] = "feedback";
Yusuke Sato39acf512016-10-17 21:57:00 -070020
21constexpr char kTar[] = "/bin/tar";
22constexpr char kSystemLogs[] = "/var/log";
Pin-Yen Lin187e1672020-02-17 18:22:42 +080023constexpr char kCrashLogs[] = "/var/spool/crash";
Yusuke Sato39acf512016-10-17 21:57:00 -070024
Yusuke Sato39acf512016-10-17 21:57:00 -070025} // namespace
Elly Jones0b6bd182012-02-14 18:24:22 -050026
Tom Hughesd6c2d392020-08-24 18:12:11 -070027void DebugLogsTool::GetDebugLogs(bool is_compressed, const base::ScopedFD& fd) {
Brian Norrisca4fc042018-04-03 00:24:26 -070028 base::ScopedTempDir temp_dir;
29 if (!temp_dir.CreateUniqueTempDir()) {
30 PLOG(WARNING) << "Failed to create a temporary directory";
31 return;
32 }
Yusuke Sato39acf512016-10-17 21:57:00 -070033
Brian Norrisca4fc042018-04-03 00:24:26 -070034 base::FilePath logs_path = temp_dir.GetPath().Append(kFeedbackLogsDir);
35 if (!base::CreateDirectory(logs_path)) {
36 PLOG(WARNING) << "Failed to create dir: " << logs_path.value();
37 return;
38 }
39
40 LogTool log_tool(bus_);
41 LogTool::LogMap logs = log_tool.GetAllDebugLogs();
42 for (const auto& l : logs) {
43 const std::string& name = l.first;
44 const std::string& contents = l.second;
45 if (base::WriteFile(logs_path.Append(name), contents.data(),
Tom Hughesd6c2d392020-08-24 18:12:11 -070046 contents.size()) < 0) {
Brian Norrisca4fc042018-04-03 00:24:26 -070047 PLOG(WARNING) << "Failed to write file: " << name;
48 }
Yusuke Sato39acf512016-10-17 21:57:00 -070049 }
50
Alex Vakulenkoe7696532015-10-16 16:27:29 -070051 brillo::ProcessImpl p;
Jonathan Backer7b806fd2013-04-18 15:00:58 -040052 p.AddArg(kTar);
53 p.AddArg("-c");
Zelidrag Hornungd407be02014-07-09 09:30:25 -070054 if (is_compressed)
55 p.AddArg("-z");
Brian Norrisca4fc042018-04-03 00:24:26 -070056 p.AddArg("-C");
57 p.AddArg(temp_dir.GetPath().value());
58 p.AddArg(kFeedbackLogsDir);
Jonathan Backer7b806fd2013-04-18 15:00:58 -040059 p.AddArg(kSystemLogs);
Pin-Yen Lin187e1672020-02-17 18:22:42 +080060 p.AddArg(kCrashLogs);
Eric Caruso0b241882018-04-04 13:43:46 -070061 p.BindFd(fd.get(), STDOUT_FILENO);
Jonathan Backer7b806fd2013-04-18 15:00:58 -040062 p.Run();
Elly Jones0b6bd182012-02-14 18:24:22 -050063}
64
Ben Chana0011d82014-05-13 00:19:29 -070065} // namespace debugd