blob: 4efa88e774203df9e6851335ebce1ee95d741fe0 [file] [log] [blame]
Elly Jones03cd6d72012-06-11 13:04:28 -04001// 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
Alex Vakulenko262be3f2014-07-30 15:25:50 -07005#include "debugd/src/log_tool.h"
Elly Jones03cd6d72012-06-11 13:04:28 -04006
Ben Chana0011d82014-05-13 00:19:29 -07007#include <vector>
8
Ben Chanab93abf2017-01-24 13:32:51 -08009#include <base/base64.h>
Ben Chancd8fda42014-09-05 08:21:06 -070010#include <base/files/file_util.h>
Ahmed Fakhry21140cf2016-03-04 17:15:19 -080011#include <base/json/json_writer.h>
Elly Jones03cd6d72012-06-11 13:04:28 -040012#include <base/logging.h>
Ben Chan9953a592014-02-05 23:32:00 -080013#include <base/strings/string_split.h>
14#include <base/strings/string_util.h>
Ahmed Fakhry21140cf2016-03-04 17:15:19 -080015#include <base/values.h>
Elly Jones03cd6d72012-06-11 13:04:28 -040016
Rebecca Silbersteine78af402014-10-02 10:55:04 -070017#include <chromeos/dbus/service_constants.h>
Peter Qiued45fda2015-09-09 16:52:50 -070018#include <shill/dbus_proxies/org.chromium.flimflam.Manager.h>
Rebecca Silbersteine78af402014-10-02 10:55:04 -070019
Alex Vakulenko262be3f2014-07-30 15:25:50 -070020#include "debugd/src/process_with_output.h"
Elly Jones03cd6d72012-06-11 13:04:28 -040021
22namespace debugd {
23
Elly Jones03cd6d72012-06-11 13:04:28 -040024using std::string;
25using std::vector;
26
Ben Chan81905fb2017-02-08 22:03:11 -080027using Strings = vector<string>;
Elly Jones03cd6d72012-06-11 13:04:28 -040028
Ahmed Fakhry21140cf2016-03-04 17:15:19 -080029const char *kDebugfsGroup = "debugfs-access";
Eric Carusoe3166f22016-06-10 15:36:02 -070030const char *kRoot = "root";
Ben Chanf6cd93a2012-10-14 19:37:00 -070031
Ahmed Fakhry21140cf2016-03-04 17:15:19 -080032namespace {
33
34const char *kShell = "/bin/sh";
35
36// Minimum time in seconds needed to allow shill to test active connections.
37const int kConnectionTesterTimeoutSeconds = 5;
Ben Chanf6cd93a2012-10-14 19:37:00 -070038
Elly Fong-Jonesd9a16cd2012-11-12 16:09:49 -050039struct Log {
40 const char *name;
41 const char *command;
42 const char *user;
43 const char *group;
Ricky Zhou4c473ca2016-06-21 17:46:58 -070044 const char *size_cap; // passed as arg to 'tail'
Elly Fong-Jonesd9a16cd2012-11-12 16:09:49 -050045};
46
Ahmed Fakhry21140cf2016-03-04 17:15:19 -080047const Log common_logs[] = {
Mike Frysingerc3e835a2017-01-06 04:09:34 -050048 { "CLIENT_ID", "/usr/bin/metrics_client -i"},
Elly Jones03cd6d72012-06-11 13:04:28 -040049 { "LOGDATE", "/bin/date" },
Elly Jones03cd6d72012-06-11 13:04:28 -040050 { "bios_info", "/bin/cat /var/log/bios_info.txt" },
Vadim Bendebury64aeeed2013-09-16 13:16:49 -070051 { "bios_log",
52 "/bin/cat /sys/firmware/log "
53 "/proc/device-tree/chosen/ap-console-buffer 2> /dev/null" },
Stefan Reinauer4393fa72012-10-18 11:08:09 -070054 { "bios_times", "/bin/cat /var/log/bios_times.txt" },
Elly Jones03cd6d72012-06-11 13:04:28 -040055 { "board-specific",
Thiemo Nagela269ad22014-11-27 17:13:01 +010056 "/usr/share/userfeedback/scripts/get_board_specific_info" },
Olof Johanssone5d0fd32016-01-29 14:40:34 -080057 { "cheets_log", "/usr/bin/collect-cheets-logs 2>&1" },
Thiemo Nagela269ad22014-11-27 17:13:01 +010058 { "clobber.log", "/bin/cat /var/log/clobber.log 2> /dev/null" },
59 { "clobber-state.log", "/bin/cat /var/log/clobber-state.log 2> /dev/null" },
Elly Jones03cd6d72012-06-11 13:04:28 -040060 { "chrome_system_log", "/bin/cat /var/log/chrome/chrome" },
Stefan Reinauer48f883d2014-08-22 14:31:58 -070061 { "console-ramoops", "/bin/cat /dev/pstore/console-ramoops 2> /dev/null" },
Elly Jones03cd6d72012-06-11 13:04:28 -040062 { "cpu", "/usr/bin/uname -p" },
63 { "cpuinfo", "/bin/cat /proc/cpuinfo" },
Benson Leung1526c8f2017-01-22 20:38:04 -080064 { "cr50_version", "/bin/cat /var/cache/cr50-version" },
Eric Caruso57333f12015-09-08 12:50:32 -070065 { "cros_ec",
66 "/bin/cat /var/log/cros_ec.previous /var/log/cros_ec.log 2> /dev/null" },
Nicolas Boichat083795f2016-08-16 11:16:49 +020067 { "cros_ec_panicinfo",
Nicolas Boichatd51092b2016-09-01 10:36:46 +080068 "/bin/cat /sys/kernel/debug/cros_ec/panicinfo 2> /dev/null",
69 SandboxedProcess::kDefaultUser,
70 kDebugfsGroup
71 },
Elly Jones03cd6d72012-06-11 13:04:28 -040072 { "dmesg", "/bin/dmesg" },
73 { "ec_info", "/bin/cat /var/log/ec_info.txt" },
Stefan Reinauer4393fa72012-10-18 11:08:09 -070074 { "eventlog", "/bin/cat /var/log/eventlog.txt" },
Elly Fong-Jones215b5622013-03-20 14:32:18 -040075 {
76 "exynos_gem_objects",
Yuly Novikov13ece852013-07-11 17:19:10 -040077 "/bin/cat /sys/kernel/debug/dri/0/exynos_gem_objects 2> /dev/null",
Elly Fong-Jones215b5622013-03-20 14:32:18 -040078 SandboxedProcess::kDefaultUser,
79 kDebugfsGroup
80 },
Elly Jones03cd6d72012-06-11 13:04:28 -040081 { "font_info", "/usr/share/userfeedback/scripts/font_info" },
82 { "hardware_class", "/usr/bin/crossystem hwid" },
83 { "hostname", "/bin/hostname" },
84 { "hw_platform", "/usr/bin/uname -i" },
Elly Fong-Jones215b5622013-03-20 14:32:18 -040085 {
86 "i915_gem_gtt",
Yuly Novikov13ece852013-07-11 17:19:10 -040087 "/bin/cat /sys/kernel/debug/dri/0/i915_gem_gtt 2> /dev/null",
Elly Fong-Jones215b5622013-03-20 14:32:18 -040088 SandboxedProcess::kDefaultUser,
89 kDebugfsGroup
90 },
91 {
92 "i915_gem_objects",
Yuly Novikov13ece852013-07-11 17:19:10 -040093 "/bin/cat /sys/kernel/debug/dri/0/i915_gem_objects 2> /dev/null",
Elly Fong-Jones215b5622013-03-20 14:32:18 -040094 SandboxedProcess::kDefaultUser,
95 kDebugfsGroup
96 },
97 {
98 "i915_error_state",
Yuly Novikov4ac12fb2013-07-18 20:08:44 -040099 "/usr/bin/xz -c /sys/kernel/debug/dri/0/i915_error_state 2> /dev/null",
Elly Fong-Jones215b5622013-03-20 14:32:18 -0400100 SandboxedProcess::kDefaultUser,
101 kDebugfsGroup,
102 },
Daniel Erat982ab4b2014-04-09 07:32:38 -0700103 { "ifconfig", "/bin/ifconfig -a" },
Stefan Reinauer48f883d2014-08-22 14:31:58 -0700104 { "kernel-crashes",
105 "/bin/cat /var/spool/crash/kernel.*.kcrash 2> /dev/null" },
Elly Jones03cd6d72012-06-11 13:04:28 -0400106 { "lsmod", "lsmod" },
107 { "lspci", "/usr/sbin/lspci" },
108 { "lsusb", "lsusb" },
Yuly Novikov13ece852013-07-11 17:19:10 -0400109 {
Thiemo Nagela269ad22014-11-27 17:13:01 +0100110 "mali_memory",
111 "/bin/cat /sys/class/misc/mali0/device/memory 2> /dev/null"
Yuly Novikov13ece852013-07-11 17:19:10 -0400112 },
Elly Jones03cd6d72012-06-11 13:04:28 -0400113 { "meminfo", "cat /proc/meminfo" },
114 { "memory_spd_info", "/bin/cat /var/log/memory_spd_info.txt" },
Kees Cooka8f3e7e2012-11-19 14:16:01 -0800115 { "mount-encrypted", "/bin/cat /var/log/mount-encrypted.log" },
Darin Petkov54743582012-12-10 14:18:32 +0100116 { "net-diags.net.log", "/bin/cat /var/log/net-diags.net.log" },
Wade Guthrie67b672e2012-11-14 13:14:31 -0800117 { "netlog", "/usr/share/userfeedback/scripts/getmsgs --last '2 hours'"
118 " /var/log/net.log" },
henryhsufa6daa12014-09-24 13:26:30 +0800119 {
120 "nvmap_iovmm",
121 "/bin/cat /sys/kernel/debug/nvmap/iovmm/allocations 2> /dev/null",
122 SandboxedProcess::kDefaultUser,
123 kDebugfsGroup,
124 },
Vincent Palatinc64af9d2013-08-05 16:34:10 -0700125 { "platform_info", "/bin/cat /var/log/platform_info.txt" },
Daniel Erat9b58b6d2013-04-30 14:58:56 -0700126 { "power_supply_info", "/usr/bin/power_supply_info" },
Elly Jones03cd6d72012-06-11 13:04:28 -0400127 { "powerd.LATEST", "/bin/cat /var/log/power_manager/powerd.LATEST" },
Daniel Erat546c3882013-11-22 12:46:01 -0800128 { "powerd.PREVIOUS", "/bin/cat /var/log/power_manager/powerd.PREVIOUS" },
Daniel Erat93da9a12012-12-06 14:14:17 -0800129 { "powerd.out", "/bin/cat /var/log/powerd.out" },
Thiemo Nagela269ad22014-11-27 17:13:01 +0100130 { "powerwash_count", "/bin/cat /var/log/powerwash_count 2> /dev/null" },
Elly Jones03cd6d72012-06-11 13:04:28 -0400131 // Changed from 'ps ux' to 'ps aux' since we're running as debugd, not chronos
132 { "ps", "/bin/ps aux" },
Puthikorn Voravootivat6de5e122013-12-06 11:43:13 -0800133 { "storage_info", "/bin/cat /var/log/storage_info.txt" },
Elly Jones03cd6d72012-06-11 13:04:28 -0400134 { "syslog", "/usr/share/userfeedback/scripts/getmsgs --last '2 hours'"
Elly Jonesf8a67ee2012-06-19 13:48:38 -0400135 " /var/log/messages" },
Elly Fong-Jonesb4f49c42013-02-28 13:45:26 -0500136 { "tlsdate", "/bin/cat /var/log/tlsdate.log" },
Michael Spang387567d2015-03-11 17:16:04 -0400137 { "input_devices", "/bin/cat /proc/bus/input/devices" },
Hsu-Cheng Tsai4210f3c2016-08-05 10:50:19 +0800138 { "top", "/usr/bin/top -Hb -n 1 | head -n 40"},
Elly Jones03cd6d72012-06-11 13:04:28 -0400139 { "touchpad", "/opt/google/touchpad/tpcontrol status" },
Chung-yih Wang4b876142014-04-30 17:01:49 +0800140 { "touchpad_activity", "/opt/google/input/cmt_feedback alt" },
Andrew de los Reyesc060c342013-04-10 13:46:30 -0700141 { "touch_fw_version", "grep -E"
Charlie Mooneybb08f982016-02-04 15:35:56 -0800142 " -e 'synaptics: Touchpad model'"
143 " -e 'chromeos-[a-z]*-touch-[a-z]*-update'"
Andrew de los Reyesc060c342013-04-10 13:46:30 -0700144 " /var/log/messages | tail -n 20" },
Gwendal Grignou427d94e2016-10-25 11:34:51 -0700145 {
146 "trim",
147 "cat /var/lib/trim/stateful_trim_state /var/lib/trim/stateful_trim_data"
148 },
Elly Jones03cd6d72012-06-11 13:04:28 -0400149 { "ui_log", "/usr/share/userfeedback/scripts/get_log /var/log/ui/ui.LATEST" },
150 { "uname", "/bin/uname -a" },
151 { "update_engine.log", "cat $(ls -1tr /var/log/update_engine | tail -5 | sed"
Thiemo Nagela269ad22014-11-27 17:13:01 +0100152 " s.^./var/log/update_engine/.)" },
Elly Jones03cd6d72012-06-11 13:04:28 -0400153 { "verified boot", "/bin/cat /var/log/debug_vboot_noisy.log" },
154 { "vpd_2.0", "/bin/cat /var/log/vpd_2.0.txt" },
Samuel Tan107b6c82014-07-10 15:33:44 -0700155 { "wifi_status", "/usr/bin/network_diag --wifi-internal --no-log" },
Sonny Raoab5f9952013-07-17 14:13:53 -0700156 { "zram compressed data size",
157 "/bin/cat /sys/block/zram0/compr_data_size 2> /dev/null" },
158 { "zram original data size",
159 "/bin/cat /sys/block/zram0/orig_data_size 2> /dev/null" },
160 { "zram total memory used",
161 "/bin/cat /sys/block/zram0/mem_used_total 2> /dev/null" },
162 { "zram total reads",
163 "/bin/cat /sys/block/zram0/num_reads 2> /dev/null" },
164 { "zram total writes",
165 "/bin/cat /sys/block/zram0/num_writes 2> /dev/null" },
Gaurav Shah6e8fd892012-10-01 11:51:08 -0700166
Elly Jones03cd6d72012-06-11 13:04:28 -0400167 // Stuff pulled out of the original list. These need access to the running X
168 // session, which we'd rather not give to debugd, or return info specific to
169 // the current session (in the setsid(2) sense), which is not useful for
170 // debugd
171 // { "env", "set" },
172 // { "setxkbmap", "/usr/bin/setxkbmap -print -query" },
173 // { "xrandr", "/usr/bin/xrandr --verbose" }
Ben Chan64d19b22017-02-06 14:03:47 -0800174 { nullptr, nullptr }
Elly Jones533c7c42012-08-10 15:07:05 -0400175};
176
Ahmed Fakhry21140cf2016-03-04 17:15:19 -0800177const Log extra_logs[] = {
Ben Chan36e42282014-02-12 22:32:34 -0800178#if USE_CELLULAR
Elly Jones533c7c42012-08-10 15:07:05 -0400179 { "mm-status", "/usr/bin/modem status" },
Ben Chan36e42282014-02-12 22:32:34 -0800180#endif // USE_CELLULAR
Elly Jones533c7c42012-08-10 15:07:05 -0400181 { "network-devices", "/usr/bin/connectivity show devices" },
182 { "network-services", "/usr/bin/connectivity show services" },
Ben Chan64d19b22017-02-06 14:03:47 -0800183 { nullptr, nullptr }
Elly Jones533c7c42012-08-10 15:07:05 -0400184};
185
Ahmed Fakhry21140cf2016-03-04 17:15:19 -0800186const Log feedback_logs[] = {
Ben Chan36e42282014-02-12 22:32:34 -0800187#if USE_CELLULAR
Elly Jones533c7c42012-08-10 15:07:05 -0400188 { "mm-status", "/usr/bin/modem status-feedback" },
Ben Chan36e42282014-02-12 22:32:34 -0800189#endif // USE_CELLULAR
Elly Jones533c7c42012-08-10 15:07:05 -0400190 { "network-devices", "/usr/bin/connectivity show-feedback devices" },
191 { "network-services", "/usr/bin/connectivity show-feedback services" },
Ben Chan64d19b22017-02-06 14:03:47 -0800192 { nullptr, nullptr }
Elly Jones03cd6d72012-06-11 13:04:28 -0400193};
194
Ahmed Fakhry1498b4e2016-03-30 12:42:20 -0700195// List of log files needed to be part of the feedback report that are huge and
196// must be sent back to the client via the file descriptor using
197// LogTool::GetBigFeedbackLogs().
198const Log big_feedback_logs[] = {
Eric Carusoe3166f22016-06-10 15:36:02 -0700199 { "arc-bugreport",
Yusuke Sato874c0a82016-10-13 15:41:37 -0700200 "/bin/cat /run/arc/bugreport/pipe 2> /dev/null",
Eric Carusoe3166f22016-06-10 15:36:02 -0700201 // ARC bugreport permissions are weird. Since we're just running cat, this
202 // shouldn't cause any issues.
203 kRoot,
Ricky Zhou4c473ca2016-06-21 17:46:58 -0700204 kRoot,
205 "10M",
Eric Carusoe3166f22016-06-10 15:36:02 -0700206 },
Ben Chan64d19b22017-02-06 14:03:47 -0800207 { nullptr, nullptr }
Ahmed Fakhry1498b4e2016-03-30 12:42:20 -0700208};
209
Gaurav Shahf6c8f2a2012-10-11 17:22:43 -0700210// List of log files that must directly be collected by Chrome. This is because
211// debugd is running under a VFS namespace and does not have access to later
212// cryptohome mounts.
Ahmed Fakhry21140cf2016-03-04 17:15:19 -0800213const Log user_logs[] = {
Elly Fong-Jones6456ce52013-04-17 13:31:13 -0400214 {"chrome_user_log", "log/chrome"},
215 {"login-times", "login-times"},
216 {"logout-times", "logout-times"},
Ben Chan64d19b22017-02-06 14:03:47 -0800217 { nullptr, nullptr}
Gaurav Shahf6c8f2a2012-10-11 17:22:43 -0700218};
219
Ahmed Fakhry21140cf2016-03-04 17:15:19 -0800220class ManagerProxy : public org::chromium::flimflam::Manager_proxy,
221 public DBus::ObjectProxy {
222 public:
223 ManagerProxy(DBus::Connection* connection,
224 const char* path,
225 const char* service)
226 : DBus::ObjectProxy(*connection, path, service) {}
227 ~ManagerProxy() override = default;
228 void PropertyChanged(const std::string&, const DBus::Variant&) override {}
229 void StateChanged(const std::string&) override {}
230};
231
232// Returns |value| if |value| is a valid UTF-8 string or a base64-encoded
233// string of |value| otherwise.
234string EnsureUTF8String(const string& value) {
235 if (base::IsStringUTF8(value))
236 return value;
237
Ben Chanab93abf2017-01-24 13:32:51 -0800238 std::string encoded_value;
239 base::Base64Encode(value, &encoded_value);
240 return "<base64>: " + encoded_value;
Ahmed Fakhry21140cf2016-03-04 17:15:19 -0800241}
242
243// TODO(ellyjones): sandbox. crosbug.com/35122
244string Run(const Log& log) {
245 string output;
246 ProcessWithOutput p;
Ricky Zhou4c473ca2016-06-21 17:46:58 -0700247 string tailed_cmdline = std::string(log.command) + " | tail -c " +
Ahmed Fakhrye4a0b502016-09-19 18:18:49 -0700248 (log.size_cap ? log.size_cap : "512K");
Ahmed Fakhry21140cf2016-03-04 17:15:19 -0800249 if (log.user && log.group)
250 p.SandboxAs(log.user, log.group);
251 if (!p.Init())
252 return "<not available>";
253 p.AddArg(kShell);
254 p.AddStringOption("-c", tailed_cmdline);
255 if (p.Run())
256 return "<not available>";
257 p.GetOutput(&output);
258 if (!output.size())
259 return "<empty>";
260 return EnsureUTF8String(output);
261}
262
263// Fills |dictionary| with the anonymized contents of the logs in |logs|.
264void GetLogsInDictionary(const struct Log* logs,
265 AnonymizerTool* anonymizer,
266 base::DictionaryValue* dictionary) {
267 for (size_t i = 0; logs[i].name; ++i) {
268 dictionary->SetStringWithoutPathExpansion(
269 logs[i].name, anonymizer->Anonymize(Run(logs[i])));
270 }
271}
272
273// Serializes the |dictionary| into the file with the given |fd| in a JSON
274// format.
275void SerializeLogsAsJSON(const base::DictionaryValue& dictionary,
276 const DBus::FileDescriptor& fd) {
277 std::string logs_json;
278 base::JSONWriter::WriteWithOptions(dictionary,
279 base::JSONWriter::OPTIONS_PRETTY_PRINT,
280 &logs_json);
281 base::WriteFileDescriptor(fd.get(), logs_json.c_str(), logs_json.size());
282}
283
Elly Jones533c7c42012-08-10 15:07:05 -0400284bool GetNamedLogFrom(const string& name, const struct Log* logs,
285 string* result) {
286 for (size_t i = 0; logs[i].name; i++) {
287 if (name == logs[i].name) {
Elly Fong-Jonesd9a16cd2012-11-12 16:09:49 -0500288 *result = Run(logs[i]);
Elly Jones533c7c42012-08-10 15:07:05 -0400289 return true;
290 }
291 }
292 *result = "<invalid log name>";
293 return false;
Elly Jones03cd6d72012-06-11 13:04:28 -0400294}
295
Ahmed Fakhry21140cf2016-03-04 17:15:19 -0800296void GetLogsFrom(const struct Log* logs, LogTool::LogMap* map) {
297 for (size_t i = 0; logs[i].name; i++)
298 (*map)[logs[i].name] = Run(logs[i]);
299}
300
301} // namespace
302
Rebecca Silbersteine78af402014-10-02 10:55:04 -0700303void LogTool::CreateConnectivityReport(DBus::Connection* connection) {
304 // Perform ConnectivityTrial to report connection state in feedback log.
305 ManagerProxy shill(connection,
306 shill::kFlimflamServicePath,
307 shill::kFlimflamServiceName);
308 shill.CreateConnectivityReport();
309 // Give the connection trial time to test the connection and log the results
310 // before collecting the logs for feedback.
311 // TODO(silberst): Replace the simple approach of a single timeout with a more
312 // coordinated effort.
313 sleep(kConnectionTesterTimeoutSeconds);
314}
315
Ben Chana0011d82014-05-13 00:19:29 -0700316string LogTool::GetLog(const string& name, DBus::Error* error) {
Elly Jones533c7c42012-08-10 15:07:05 -0400317 string result;
318 GetNamedLogFrom(name, common_logs, &result)
319 || GetNamedLogFrom(name, extra_logs, &result)
320 || GetNamedLogFrom(name, feedback_logs, &result);
321 return result;
322}
323
Rebecca Silbersteine78af402014-10-02 10:55:04 -0700324LogTool::LogMap LogTool::GetAllLogs(DBus::Connection* connection,
325 DBus::Error* error) {
326 CreateConnectivityReport(connection);
Elly Jones533c7c42012-08-10 15:07:05 -0400327 LogMap result;
328 GetLogsFrom(common_logs, &result);
329 GetLogsFrom(extra_logs, &result);
330 return result;
331}
332
Rebecca Silbersteine78af402014-10-02 10:55:04 -0700333LogTool::LogMap LogTool::GetFeedbackLogs(DBus::Connection* connection,
334 DBus::Error* error) {
335 CreateConnectivityReport(connection);
Elly Jones533c7c42012-08-10 15:07:05 -0400336 LogMap result;
337 GetLogsFrom(common_logs, &result);
338 GetLogsFrom(feedback_logs, &result);
Darin Petkovce9b3a12013-01-10 16:38:54 +0100339 AnonymizeLogMap(&result);
Elly Jones03cd6d72012-06-11 13:04:28 -0400340 return result;
341}
342
Ahmed Fakhry21140cf2016-03-04 17:15:19 -0800343void LogTool::GetBigFeedbackLogs(DBus::Connection* connection,
344 const DBus::FileDescriptor& fd,
345 DBus::Error* error) {
346 CreateConnectivityReport(connection);
347 base::DictionaryValue dictionary;
348 GetLogsInDictionary(common_logs, &anonymizer_, &dictionary);
349 GetLogsInDictionary(feedback_logs, &anonymizer_, &dictionary);
Ahmed Fakhry1498b4e2016-03-30 12:42:20 -0700350 GetLogsInDictionary(big_feedback_logs, &anonymizer_, &dictionary);
Ahmed Fakhry21140cf2016-03-04 17:15:19 -0800351 SerializeLogsAsJSON(dictionary, fd);
Ahmed Fakhry1498b4e2016-03-30 12:42:20 -0700352
353 // We need to manually close the FD here to enable the client to read the
354 // contents via a pipe.
355 close(fd.get());
Ahmed Fakhry21140cf2016-03-04 17:15:19 -0800356}
357
Ben Chana0011d82014-05-13 00:19:29 -0700358LogTool::LogMap LogTool::GetUserLogFiles(DBus::Error* error) {
Gaurav Shahf6c8f2a2012-10-11 17:22:43 -0700359 LogMap result;
360 for (size_t i = 0; user_logs[i].name; ++i)
361 result[user_logs[i].name] = user_logs[i].command;
362 return result;
363}
364
Darin Petkovce9b3a12013-01-10 16:38:54 +0100365void LogTool::AnonymizeLogMap(LogMap* log_map) {
Ben Chane2fa3572017-02-08 22:46:18 -0800366 for (auto& entry : *log_map)
367 entry.second = anonymizer_.Anonymize(entry.second);
Darin Petkovce9b3a12013-01-10 16:38:54 +0100368}
369
Ben Chana0011d82014-05-13 00:19:29 -0700370} // namespace debugd