blob: 46e883637fdd44c41da30fa7ff4e194ef26bc8c5 [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>
Alex Vakulenkoe7696532015-10-16 16:27:29 -070013#include <brillo/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
Zelidrag Hornungd407be02014-07-09 09:30:25 -070027void DebugLogsTool::GetDebugLogs(bool is_compressed,
Eric Caruso0b241882018-04-04 13:43:46 -070028 const base::ScopedFD& fd) {
Brian Norrisca4fc042018-04-03 00:24:26 -070029 base::ScopedTempDir temp_dir;
30 if (!temp_dir.CreateUniqueTempDir()) {
31 PLOG(WARNING) << "Failed to create a temporary directory";
32 return;
33 }
Yusuke Sato39acf512016-10-17 21:57:00 -070034
Brian Norrisca4fc042018-04-03 00:24:26 -070035 base::FilePath logs_path = temp_dir.GetPath().Append(kFeedbackLogsDir);
36 if (!base::CreateDirectory(logs_path)) {
37 PLOG(WARNING) << "Failed to create dir: " << logs_path.value();
38 return;
39 }
40
41 LogTool log_tool(bus_);
42 LogTool::LogMap logs = log_tool.GetAllDebugLogs();
43 for (const auto& l : logs) {
44 const std::string& name = l.first;
45 const std::string& contents = l.second;
46 if (base::WriteFile(logs_path.Append(name), contents.data(),
47 contents.size()) < 0) {
48 PLOG(WARNING) << "Failed to write file: " << name;
49 }
Yusuke Sato39acf512016-10-17 21:57:00 -070050 }
51
Alex Vakulenkoe7696532015-10-16 16:27:29 -070052 brillo::ProcessImpl p;
Jonathan Backer7b806fd2013-04-18 15:00:58 -040053 p.AddArg(kTar);
54 p.AddArg("-c");
Zelidrag Hornungd407be02014-07-09 09:30:25 -070055 if (is_compressed)
56 p.AddArg("-z");
Brian Norrisca4fc042018-04-03 00:24:26 -070057 p.AddArg("-C");
58 p.AddArg(temp_dir.GetPath().value());
59 p.AddArg(kFeedbackLogsDir);
Jonathan Backer7b806fd2013-04-18 15:00:58 -040060 p.AddArg(kSystemLogs);
Pin-Yen Lin187e1672020-02-17 18:22:42 +080061 p.AddArg(kCrashLogs);
Eric Caruso0b241882018-04-04 13:43:46 -070062 p.BindFd(fd.get(), STDOUT_FILENO);
Jonathan Backer7b806fd2013-04-18 15:00:58 -040063 p.Run();
Elly Jones0b6bd182012-02-14 18:24:22 -050064}
65
Ben Chana0011d82014-05-13 00:19:29 -070066} // namespace debugd