blob: 2e14323d3b6dd2306f7a53a749288c6f07b48dc0 [file] [log] [blame]
Darin Petkovf0136cd2012-11-07 16:18:02 +01001// 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
5#include "shill/diagnostics_reporter.h"
6
Alex Vakulenko8a532292014-06-16 17:18:44 -07007#include <vector>
8
Ben Chan11c213f2014-09-05 08:21:06 -07009#include <base/files/file_util.h>
Utkarsh Sanghi83bd64b2014-07-29 16:01:43 -070010#include <chromeos/minijail/minijail.h>
Darin Petkov38066762012-12-17 15:35:45 +010011
Peter Qiu8d6b5972014-10-28 15:33:34 -070012#include "shill/net/shill_time.h"
Darin Petkov38066762012-12-17 15:35:45 +010013#include "shill/process_killer.h"
Darin Petkov38066762012-12-17 15:35:45 +010014#include "shill/shims/net_diags_upload.h"
15
16using base::Closure;
17using std::vector;
Darin Petkovf0136cd2012-11-07 16:18:02 +010018
19namespace shill {
20
21namespace {
22
23base::LazyInstance<DiagnosticsReporter> g_reporter = LAZY_INSTANCE_INITIALIZER;
Darin Petkovbd0dcc82012-11-29 10:51:12 +010024const char kNetDiagsUpload[] = SHIMDIR "/net-diags-upload";
Darin Petkov38066762012-12-17 15:35:45 +010025const char kNetDiagsUploadUser[] = "syslog";
Darin Petkovf0136cd2012-11-07 16:18:02 +010026
27} // namespace
28
Darin Petkov328e19d2012-12-04 15:54:07 +010029// static
30const int DiagnosticsReporter::kLogStashThrottleSeconds = 30 * 60;
31
32DiagnosticsReporter::DiagnosticsReporter()
Utkarsh Sanghi83bd64b2014-07-29 16:01:43 -070033 : minijail_(chromeos::Minijail::GetInstance()),
Darin Petkov38066762012-12-17 15:35:45 +010034 process_killer_(ProcessKiller::GetInstance()),
Darin Petkov328e19d2012-12-04 15:54:07 +010035 time_(Time::GetInstance()),
Darin Petkov38066762012-12-17 15:35:45 +010036 last_log_stash_(0),
37 stashed_net_log_(shims::kStashedNetLog) {}
Darin Petkovf0136cd2012-11-07 16:18:02 +010038
39DiagnosticsReporter::~DiagnosticsReporter() {}
40
41// static
Paul Stewarta794cd62015-06-16 13:13:10 -070042DiagnosticsReporter* DiagnosticsReporter::GetInstance() {
Darin Petkovf0136cd2012-11-07 16:18:02 +010043 return g_reporter.Pointer();
44}
45
Darin Petkov385b9bc2012-12-03 15:25:05 +010046void DiagnosticsReporter::OnConnectivityEvent() {
47 LOG(INFO) << "Diagnostics event triggered.";
48
mukesh agrawalbd461362013-11-08 17:34:22 -080049 struct timeval now{};
Darin Petkov328e19d2012-12-04 15:54:07 +010050 time_->GetTimeMonotonic(&now);
Darin Petkov19321e42012-12-17 15:40:59 +010051 if (last_log_stash_ &&
52 last_log_stash_ + kLogStashThrottleSeconds >
Ben Chan7fab8972014-08-10 17:14:46 -070053 static_cast<uint64_t>(now.tv_sec)) {
Darin Petkov328e19d2012-12-04 15:54:07 +010054 LOG(INFO) << "Diagnostics throttled.";
55 return;
56 }
57
58 last_log_stash_ = now.tv_sec;
Darin Petkov38066762012-12-17 15:35:45 +010059 // Delete logs possibly stashed by a different user.
Ben Chana0ddf462014-02-06 11:32:42 -080060 base::DeleteFile(stashed_net_log_, false);
Darin Petkov385b9bc2012-12-03 15:25:05 +010061
Darin Petkovfac01f02012-12-06 12:44:07 +010062 LOG(INFO) << "Spawning " << kNetDiagsUpload << " @ " << last_log_stash_;
Paul Stewarta794cd62015-06-16 13:13:10 -070063 vector<char*> args;
64 args.push_back(const_cast<char*>(kNetDiagsUpload));
Darin Petkov38066762012-12-17 15:35:45 +010065 if (IsReportingEnabled()) {
Paul Stewarta794cd62015-06-16 13:13:10 -070066 args.push_back(const_cast<char*>("--upload"));
Darin Petkov38066762012-12-17 15:35:45 +010067 }
Ben Chancc225ef2014-09-30 13:26:51 -070068 args.push_back(nullptr);
Darin Petkov38066762012-12-17 15:35:45 +010069 pid_t pid = 0;
Paul Stewarta794cd62015-06-16 13:13:10 -070070 struct minijail* jail = minijail_->New();
Utkarsh Sanghie4c6aff2014-07-30 14:49:03 -070071 minijail_->DropRoot(jail, kNetDiagsUploadUser, kNetDiagsUploadUser);
Darin Petkov38066762012-12-17 15:35:45 +010072 if (minijail_->RunAndDestroy(jail, args, &pid)) {
73 process_killer_->Wait(pid, Closure());
74 } else {
75 LOG(ERROR) << "Unable to spawn " << kNetDiagsUpload;
Darin Petkovfac01f02012-12-06 12:44:07 +010076 }
Darin Petkov385b9bc2012-12-03 15:25:05 +010077}
78
Darin Petkovf0136cd2012-11-07 16:18:02 +010079bool DiagnosticsReporter::IsReportingEnabled() {
80 // TODO(petkov): Implement this when there's a way to control reporting
Paul Stewartee6b3d72013-07-12 16:07:51 -070081 // through policy. crbug.com/218045.
Darin Petkovf0136cd2012-11-07 16:18:02 +010082 return false;
83}
84
Darin Petkovf0136cd2012-11-07 16:18:02 +010085} // namespace shill