| // Copyright 2021 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/bluetooth_utils.h" |
| |
| #include <stdio.h> |
| #include <string> |
| |
| #include <base/bind.h> |
| #include <base/callback_helpers.h> |
| #include <base/files/file_path.h> |
| #include <base/files/file_util.h> |
| #include <base/files/scoped_file.h> |
| #include <base/logging.h> |
| #include <brillo/process/process.h> |
| |
| #include "debugd/src/sandboxed_process.h" |
| |
| namespace debugd { |
| |
| namespace { |
| |
| constexpr char kBunzip2Command[] = "/bin/bunzip2"; |
| constexpr char kBtmonCommand[] = "/usr/bin/btmon"; |
| |
| constexpr char btsnoop_infile[] = "/var/log/bluetooth/log.bz2"; |
| constexpr char btsnoop_outfile[] = "/var/log/bluetooth/log"; |
| // The bluetooth_quality_report file is a standalone file and is not part of |
| // the system_logs. This report file is only generated if a user logs in |
| // with a Google account. The file would not be attached by the chrome unless |
| // the Googler opts in to "Attach Bluetooth Logs" in the feedback UI. |
| constexpr char report_file[] = "/var/log/bluetooth/bluetooth_quality_report"; |
| |
| constexpr char BQR_UNAVAILABLE[] = "; Bluetooth quality report unavailable"; |
| |
| } // namespace |
| |
| void GetBluetoothBqr() { |
| int ret; |
| |
| if (!base::PathExists(base::FilePath(btsnoop_infile))) { |
| PLOG(WARNING) << "The btsnoop file does not exist: " << btsnoop_infile |
| << BQR_UNAVAILABLE; |
| return; |
| } |
| |
| // Remove btsnoop_outfile at exit. |
| base::ScopedClosureRunner delete_outfile(base::BindOnce( |
| base::IgnoreResult(&base::DeleteFile), base::FilePath(btsnoop_outfile))); |
| |
| // The process is used to decompress the Bluetooth log. |
| // - input: btsnoop_infile |
| // - output: btsnoop_outfile |
| // Note: kBunzip2Command has been sandboxed so ProcessImpl is employed. |
| brillo::ProcessImpl p; |
| p.AddArg(kBunzip2Command); |
| p.AddArg("--keep"); |
| p.AddArg("--force"); |
| p.AddArg(btsnoop_infile); |
| ret = p.Run(); |
| if (ret) { |
| PLOG(WARNING) << "Failed to decompress " << btsnoop_infile |
| << BQR_UNAVAILABLE; |
| return; |
| } |
| |
| // The process is used to create the summary report. |
| // - input: btsnoop_outfile |
| // - output: report_file |
| // Note: this process should be sandboxed. |
| SandboxedProcess sp; |
| sp.SandboxAs("bluetooth", "bluetooth"); |
| sp.AddArg(kBtmonCommand); |
| sp.AddArg("--analyze"); |
| sp.AddArg(btsnoop_outfile); |
| sp.RedirectUsingFile(STDOUT_FILENO, std::string(report_file)); |
| ret = sp.Run(); |
| if (ret) |
| PLOG(WARNING) << "Failed to btmon analyze " << btsnoop_outfile |
| << BQR_UNAVAILABLE; |
| } |
| |
| } // namespace debugd |