blob: 19f089683353daa12d3dacc00288bba011a642fc [file] [log] [blame]
Satoru Takabayashie7f6d2a2018-08-08 17:06:29 +09001// Copyright 2018 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
5#ifndef CRASH_REPORTER_UTIL_H_
6#define CRASH_REPORTER_UTIL_H_
7
Satoru Takabayashib2ca40d2018-08-09 14:02:04 +09008#include <string>
9#include <vector>
10
11#include <base/files/file_path.h>
Ian Barkley-Yeungc377b092019-10-09 19:23:53 -070012#include <base/time/clock.h>
Jeffrey Kardatzkee3fb8fb2019-05-13 13:59:12 -070013#include <base/time/time.h>
Jeffrey Kardatzke18d50982019-03-21 14:13:34 -070014#include <brillo/process.h>
Jeffrey Kardatzke437fa922019-05-09 11:34:32 -070015#include <brillo/streams/stream.h>
Satoru Takabayashi8ce6db82018-08-17 15:18:41 +090016#include <session_manager/dbus-proxies.h>
Satoru Takabayashib2ca40d2018-08-09 14:02:04 +090017
Satoru Takabayashie7f6d2a2018-08-08 17:06:29 +090018namespace util {
19
Ian Barkley-Yeung7aebd752019-08-13 20:22:56 -070020// From //net/crash/collector/collector.h
21extern const int kDefaultMaxUploadBytes;
22
Satoru Takabayashie7f6d2a2018-08-08 17:06:29 +090023// Returns true if integration tests are currently running.
24bool IsCrashTestInProgress();
25
Satoru Takabayashi2d728042018-12-10 09:19:00 +090026// Returns true if uploading of device coredumps is allowed.
27bool IsDeviceCoredumpUploadAllowed();
28
Satoru Takabayashie7f6d2a2018-08-08 17:06:29 +090029// Returns true if running on a developer image.
30bool IsDeveloperImage();
31
Satoru Takabayashif6a36802018-08-14 16:23:05 +090032// Returns true if running on a test image.
33bool IsTestImage();
34
Satoru Takabayashi9a587522018-10-29 09:36:27 +090035// Returns true if running on an official image.
36bool IsOfficialImage();
37
Ian Barkley-Yeungb12d6cc2020-02-12 14:00:54 -080038// Returns true if we are mocking metrics consent as granted.
39bool HasMockConsent();
40
Miriam Zimmermana23b1a02019-12-27 17:21:39 -080041// Change group ownership of "file" to "group", and grant g+rw (optionally x).
42bool SetGroupAndPermissions(const base::FilePath& file,
43 const char* group,
44 bool execute);
45
Jeffrey Kardatzkee3fb8fb2019-05-13 13:59:12 -070046// Returns the timestamp for the OS version we are currently running. Returns
47// a null (zero-valued) base::Time if it is unable to calculate it for some
48// reason.
49base::Time GetOsTimestamp();
50
51// Returns true if this version is old enough that we do not want to upload the
52// crash reports anymore. This just checks if |timestamp| is more than 180
53// days old. If |timestamp| is null (zero-valued) then this will return false.
Ian Barkley-Yeungc377b092019-10-09 19:23:53 -070054bool IsOsTimestampTooOldForUploads(base::Time timestamp, base::Clock* clock);
Jeffrey Kardatzkee3fb8fb2019-05-13 13:59:12 -070055
Jeffrey Kardatzkeea333932019-04-12 10:17:51 -070056// Gets a string describing the hardware class of the device. Returns
57// "undefined" if this cannot be determined.
58std::string GetHardwareClass();
59
60// Returns the boot mode which will either be "dev", "missing-crossystem" (if it
61// cannot be determined) or the empty string.
62std::string GetBootModeString();
63
Satoru Takabayashib2ca40d2018-08-09 14:02:04 +090064// Tries to find |key| in a key-value file named |base_name| in |directories| in
65// the specified order, and writes the value to |value|. This function returns
66// as soon as the key is found (i.e. if the key is found in the first directory,
67// the remaining directories won't be checked). Returns true on success.
68bool GetCachedKeyValue(const base::FilePath& base_name,
69 const std::string& key,
70 const std::vector<base::FilePath>& directories,
71 std::string* value);
72
73// Similar to GetCachedKeyValue(), but this version checks the predefined
74// default directories.
75bool GetCachedKeyValueDefault(const base::FilePath& base_name,
76 const std::string& key,
77 std::string* value);
78
Satoru Takabayashi8ce6db82018-08-17 15:18:41 +090079// Gets the user crash directories via D-Bus using |session_manager_proxy|.
Fergus Dalla55e5642020-03-10 20:17:00 +110080// Returns true on success.
Satoru Takabayashi8ce6db82018-08-17 15:18:41 +090081bool GetUserCrashDirectories(
82 org::chromium::SessionManagerInterfaceProxyInterface* session_manager_proxy,
83 std::vector<base::FilePath>* directories);
84
Fergus Dalla55e5642020-03-10 20:17:00 +110085bool GetDaemonStoreCrashDirectories(
86 org::chromium::SessionManagerInterfaceProxyInterface* session_manager_proxy,
87 std::vector<base::FilePath>* directories);
88
Jeffrey Kardatzke437fa922019-05-09 11:34:32 -070089// Gzip's the |data| passed in and returns the compressed data. Returns an empty
Ian Barkley-Yeunge87b4f42019-05-22 15:05:13 -070090// vector on failure.
91std::vector<unsigned char> GzipStream(brillo::StreamPtr data);
Jeffrey Kardatzke437fa922019-05-09 11:34:32 -070092
Jeffrey Kardatzke18d50982019-03-21 14:13:34 -070093// Runs |process| and redirects |fd| to |output|. Returns the exit code, or -1
94// if the process failed to start.
95int RunAndCaptureOutput(brillo::ProcessImpl* process,
96 int fd,
97 std::string* output);
98
99// Breaks up |error| using std::getline and then does a LOG(ERROR) of each
100// individual line.
101void LogMultilineError(const std::string& error);
102
Tim Zheng11a665e2019-06-26 17:44:01 -0700103// Read the memfd file contents. Return false on failure.
104bool ReadMemfdToString(int mem_fd, std::string* contents);
105
Miriam Zimmermana06220e2019-10-23 18:36:31 -0700106// Return the weight for SELinux failures. We'll only collect
107// 1.0/GetSelinuxWeight() of the failures.
108int GetSelinuxWeight();
109
110// Return the weight for service failures. We'll only collect
111// 1.0/GetServiceFailureWeight() of the failures.
112int GetServiceFailureWeight();
113
Kansho Nishida630cc7a2019-10-23 17:37:41 +0900114// Read the content binding to fd to stream.
115bool ReadFdToStream(unsigned int fd, std::stringstream* stream);
116
Sarthak Kukretid5d9b272020-04-12 22:27:12 -0700117#if USE_DIRENCRYPTION
118// Joins the session key if the kernel supports ext4 directory encryption.
119void JoinSessionKeyring();
120#endif // USE_DIRENCRYPTION
121
Satoru Takabayashie7f6d2a2018-08-08 17:06:29 +0900122} // namespace util
123
124#endif // CRASH_REPORTER_UTIL_H_