15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/system_logs/command_line_log_source.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
14bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "base/process/launch.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Gathers log data from various scripts/programs.
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ExecuteCommandLines(system_logs::SystemLogsResponse* response) {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(tudalex): Move program calling in a array or something similar to make
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it more easier to modify and understand.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::pair<std::string, CommandLine> > commands;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CommandLine command(base::FilePath("/usr/bin/amixer"));
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  command.AppendArg("-c0");
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  command.AppendArg("contents");
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  commands.push_back(std::make_pair("alsa controls", command));
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  command = CommandLine((base::FilePath("/usr/bin/cras_test_client")));
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  command.AppendArg("--dump_server_info");
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  command.AppendArg("--dump_audio_thread");
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  commands.push_back(std::make_pair("cras", command));
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  command = CommandLine((base::FilePath("/usr/bin/audio_diagnostics")));
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  commands.push_back(std::make_pair("audio_diagnostics", command));
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#if 0
4134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  // This command hangs as of R39. TODO(alhli): Make cras_test_client more
4234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  // robust or add a wrapper script that times out, and fix this or remove
4334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  // this code. crbug.com/419523
44ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  command = CommandLine((base::FilePath("/usr/bin/cras_test_client")));
45ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  command.AppendArg("--loopback_file");
46ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  command.AppendArg("/dev/null");
47ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  command.AppendArg("--rate");
48ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  command.AppendArg("44100");
49ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  command.AppendArg("--duration_seconds");
50ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  command.AppendArg("0.01");
51ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  command.AppendArg("--show_total_rms");
52ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  commands.push_back(std::make_pair("cras_rms", command));
5334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#endif
54ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  command = CommandLine((base::FilePath("/usr/bin/printenv")));
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  commands.push_back(std::make_pair("env", command));
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  command = CommandLine(base::FilePath("/usr/bin/setxkbmap"));
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  command.AppendArg("-print");
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  command.AppendArg("-query");
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  commands.push_back(std::make_pair("setxkbmap", command));
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  command = CommandLine(base::FilePath("/usr/bin/xinput"));
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  command.AppendArg("list");
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  command.AppendArg("--long");
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  commands.push_back(std::make_pair("xinput", command));
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  command = CommandLine(base::FilePath("/usr/bin/xrandr"));
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  command.AppendArg("--verbose");
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  commands.push_back(std::make_pair("xrandr", command));
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Get a list of file sizes for the logged in user (excluding the names of
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the files in the Downloads directory for privay reasons).
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  command = CommandLine(base::FilePath("/bin/sh"));
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  command.AppendArg("-c");
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  command.AppendArg("/usr/bin/du -h /home/chronos/user |"
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    " grep -v -e \\/home\\/chronos\\/user\\/Downloads\\/");
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  commands.push_back(std::make_pair("user_files", command));
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < commands.size(); ++i) {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string output;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::GetAppOutput(commands[i].second, &output);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (*response)[commands[i].first] = output;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace system_logs {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CommandLineLogSource::Fetch(const SysLogsSourceCallback& callback) {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!callback.is_null());
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SystemLogsResponse* response = new SystemLogsResponse;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostBlockingPoolTaskAndReply(
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&ExecuteCommandLines, response),
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(callback, base::Owned(response)));
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace system_logs
103