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