Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(347)

Side by Side Diff: remoting/host/remoting_me2me_host.cc

Issue 910403002: Suspend (rather than shut down) the host upon policy errors. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@mistyped-policies
Patch Set: s/HOST_INITIALIZING/HOST_STARTING/g Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « remoting/host/policy_watcher.cc ('k') | remoting/resources/remoting_strings.grd » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 // 4 //
5 // This file implements a standalone host process for Me2Me. 5 // This file implements a standalone host process for Me2Me.
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/at_exit.h" 9 #include "base/at_exit.h"
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
140 const char kWindowIdSwitchName[] = "window-id"; 140 const char kWindowIdSwitchName[] = "window-id";
141 141
142 // Maximum time to wait for clean shutdown to occur, before forcing termination 142 // Maximum time to wait for clean shutdown to occur, before forcing termination
143 // of the process. 143 // of the process.
144 const int kShutdownTimeoutSeconds = 15; 144 const int kShutdownTimeoutSeconds = 15;
145 145
146 // Maximum time to wait for reporting host-offline-reason to the service, 146 // Maximum time to wait for reporting host-offline-reason to the service,
147 // before continuing normal process shutdown. 147 // before continuing normal process shutdown.
148 const int kHostOfflineReasonTimeoutSeconds = 10; 148 const int kHostOfflineReasonTimeoutSeconds = 10;
149 149
150 // Host offline reasons not associated with shutting down the host process
151 // and therefore not expressible through HostExitCodes enum.
152 const char kHostOfflineReasonPolicyReadError[] = "POLICY_READ_ERROR";
153 const char kHostOfflineReasonPolicyChangeRequiresRestart[] =
154 "POLICY_CHANGE_REQUIRES_RESTART";
155
150 } // namespace 156 } // namespace
151 157
152 namespace remoting { 158 namespace remoting {
153 159
154 class HostProcess : public ConfigWatcher::Delegate, 160 class HostProcess : public ConfigWatcher::Delegate,
155 public HostSignalingManager::Listener, 161 public HostSignalingManager::Listener,
156 public HostChangeNotificationListener::Listener, 162 public HostChangeNotificationListener::Listener,
157 public IPC::Listener, 163 public IPC::Listener,
158 public base::RefCountedThreadSafe<HostProcess> { 164 public base::RefCountedThreadSafe<HostProcess> {
159 public: 165 public:
(...skipping 16 matching lines...) Expand all
176 void OnHostDeleted() override; 182 void OnHostDeleted() override;
177 183
178 // Handler of the ChromotingDaemonNetworkMsg_InitializePairingRegistry IPC 184 // Handler of the ChromotingDaemonNetworkMsg_InitializePairingRegistry IPC
179 // message. 185 // message.
180 void OnInitializePairingRegistry( 186 void OnInitializePairingRegistry(
181 IPC::PlatformFileForTransit privileged_key, 187 IPC::PlatformFileForTransit privileged_key,
182 IPC::PlatformFileForTransit unprivileged_key); 188 IPC::PlatformFileForTransit unprivileged_key);
183 189
184 private: 190 private:
185 enum HostState { 191 enum HostState {
186 // Host process has just been started. Waiting for config and policies to be 192 // Waiting for valid config and policies to be read from the disk.
187 // read from the disk. 193 // Either the host process has just been started, or it is trying to start
188 HOST_INITIALIZING, 194 // again after temporarily going offline due to policy change or error.
195 HOST_STARTING,
189 196
190 // Host is started and running. 197 // Host is started and running.
191 HOST_STARTED, 198 HOST_STARTED,
192 199
193 // Host is being stopped and will need to be started again. 200 // Host is sending offline reason, before trying to restart.
194 HOST_STOPPING_TO_RESTART, 201 // Used when:
202 // 1) policy change requires a restart.
203 // 2) policy error puts the host offline until we have a valid policy again.
Sergey Ulanov 2015/02/18 00:28:31 Isn't it in HOST_STARTING state in this case?
Łukasz Anforowicz 2015/02/18 17:03:11 "Host is sending offline reason" implies state_ ==
204 HOST_GOING_OFFLINE_TO_RESTART,
195 205
196 // Host is being stopped. 206 // Host is sending offline reason, before shutting down.
197 HOST_STOPPING, 207 HOST_GOING_OFFLINE_TO_STOP,
198 208
199 // Host has been stopped. 209 // Host has been stopped (host process will end soon).
200 HOST_STOPPED, 210 HOST_STOPPED,
201 211
202 // Allowed state transitions: 212 // Allowed state transitions (enforced via DCHECKs in SetState method):
Sergey Ulanov 2015/02/18 00:28:31 nit: Put this comment above HostState enum?
Łukasz Anforowicz 2015/02/18 17:03:11 I moved this comment next to SetState method (so t
203 // INITIALIZING->STARTED 213 // STARTING->STARTED (once we have valid config + policy)
204 // INITIALIZING->STOPPED 214 // STARTING->GOING_OFFLINE_TO_STOP
205 // STARTED->STOPPING_TO_RESTART 215 // STARTING->GOING_OFFLINE_TO_RESTART
206 // STARTED->STOPPING 216 // STARTED->GOING_OFFLINE_TO_STOP
207 // STOPPING_TO_RESTART->STARTED 217 // STARTED->GOING_OFFLINE_TO_RESTART
208 // STOPPING_TO_RESTART->STOPPING 218 // GOING_OFFLINE_TO_RESTART->GOING_OFFLINE_TO_STOP
209 // STOPPING->STOPPED 219 // GOING_OFFLINE_TO_RESTART->STARTING (after OnHostOfflineReasonAck)
210 // STOPPED->STARTED 220 // GOING_OFFLINE_TO_STOP->STOPPED (after OnHostOfflineReasonAck)
211 // 221 //
212 // |host_| must be nullptr in INITIALIZING and STOPPED states and not 222 // |host_| must be not-null in STARTED state and nullptr in all other states
213 // nullptr in all other states. 223 // (although this invariant can be temporarily violated when doing
224 // synchronous processing on the networking thread).
225 };
226
227 void SetState(HostState target_state) {
Sergey Ulanov 2015/02/18 00:28:31 Move this below in the class (http://google-styleg
Łukasz Anforowicz 2015/02/18 17:03:11 I see. Thanks for pointing this out. Since I dis
228 DCHECK(context_->network_task_runner()->BelongsToCurrentThread());
229
230 // DCHECKs below enforce state allowed transitions listed in HostState.
231 switch (state_) {
232 case HOST_STARTING:
233 DCHECK((target_state == HOST_STARTED) ||
234 (target_state == HOST_GOING_OFFLINE_TO_STOP) ||
235 (target_state == HOST_GOING_OFFLINE_TO_RESTART));
Sergey Ulanov 2015/02/18 00:28:31 add something like '<< state_ << "->" << target_st
Łukasz Anforowicz 2015/02/18 17:03:11 Done.
236 break;
237 case HOST_STARTED:
238 DCHECK((target_state == HOST_GOING_OFFLINE_TO_STOP) ||
239 (target_state == HOST_GOING_OFFLINE_TO_RESTART));
240 break;
241 case HOST_GOING_OFFLINE_TO_RESTART:
242 DCHECK((target_state == HOST_GOING_OFFLINE_TO_STOP) ||
243 (target_state == HOST_STARTING));
244 break;
245 case HOST_GOING_OFFLINE_TO_STOP:
246 DCHECK_EQ(target_state, HOST_STOPPED);
247 break;
248 case HOST_STOPPED:
249 default:
250 NOTREACHED(); // HOST_STOPPED is a terminal state.
251 break;
252 }
253 state_ = target_state;
254 }
255
256 enum PolicyState {
257 // Cannot start the host, because a valid policy has not been read yet.
258 POLICY_INITIALIZING,
259
260 // Policy was loaded successfully.
261 POLICY_LOADED,
262
263 // Policy error was detected, and we haven't yet sent out a
264 // host-offline-reason (i.e. because we haven't yet read the config).
265 POLICY_ERROR_REPORT_PENDING,
266
267 // Policy error was detected, and we have sent out a host-offline-reason.
268 POLICY_ERROR_REPORTED,
214 }; 269 };
215 270
216 friend class base::RefCountedThreadSafe<HostProcess>; 271 friend class base::RefCountedThreadSafe<HostProcess>;
217 ~HostProcess() override; 272 ~HostProcess() override;
218 273
219 void StartOnNetworkThread(); 274 void StartOnNetworkThread();
220 275
221 #if defined(OS_POSIX) 276 #if defined(OS_POSIX)
222 // Callback passed to RegisterSignalHandler() to handle SIGTERM events. 277 // Callback passed to RegisterSignalHandler() to handle SIGTERM events.
223 void SigTermHandler(int signal_number); 278 void SigTermHandler(int signal_number);
(...skipping 14 matching lines...) Expand all
238 293
239 // Tear down resources that run on the UI thread. 294 // Tear down resources that run on the UI thread.
240 void ShutdownOnUiThread(); 295 void ShutdownOnUiThread();
241 296
242 // Applies the host config, returning true if successful. 297 // Applies the host config, returning true if successful.
243 bool ApplyConfig(const base::DictionaryValue& config); 298 bool ApplyConfig(const base::DictionaryValue& config);
244 299
245 // Handles policy updates, by calling On*PolicyUpdate methods. 300 // Handles policy updates, by calling On*PolicyUpdate methods.
246 void OnPolicyUpdate(scoped_ptr<base::DictionaryValue> policies); 301 void OnPolicyUpdate(scoped_ptr<base::DictionaryValue> policies);
247 void OnPolicyError(); 302 void OnPolicyError();
303 void ReportPolicyErrorAndRestartHost();
248 void ApplyHostDomainPolicy(); 304 void ApplyHostDomainPolicy();
249 void ApplyUsernamePolicy(); 305 void ApplyUsernamePolicy();
250 bool OnHostDomainPolicyUpdate(base::DictionaryValue* policies); 306 bool OnHostDomainPolicyUpdate(base::DictionaryValue* policies);
251 bool OnUsernamePolicyUpdate(base::DictionaryValue* policies); 307 bool OnUsernamePolicyUpdate(base::DictionaryValue* policies);
252 bool OnNatPolicyUpdate(base::DictionaryValue* policies); 308 bool OnNatPolicyUpdate(base::DictionaryValue* policies);
253 bool OnRelayPolicyUpdate(base::DictionaryValue* policies); 309 bool OnRelayPolicyUpdate(base::DictionaryValue* policies);
254 bool OnUdpPortPolicyUpdate(base::DictionaryValue* policies); 310 bool OnUdpPortPolicyUpdate(base::DictionaryValue* policies);
255 bool OnCurtainPolicyUpdate(base::DictionaryValue* policies); 311 bool OnCurtainPolicyUpdate(base::DictionaryValue* policies);
256 bool OnHostTalkGadgetPrefixPolicyUpdate(base::DictionaryValue* policies); 312 bool OnHostTalkGadgetPrefixPolicyUpdate(base::DictionaryValue* policies);
257 bool OnHostTokenUrlPolicyUpdate(base::DictionaryValue* policies); 313 bool OnHostTokenUrlPolicyUpdate(base::DictionaryValue* policies);
258 bool OnPairingPolicyUpdate(base::DictionaryValue* policies); 314 bool OnPairingPolicyUpdate(base::DictionaryValue* policies);
259 bool OnGnubbyAuthPolicyUpdate(base::DictionaryValue* policies); 315 bool OnGnubbyAuthPolicyUpdate(base::DictionaryValue* policies);
260 316
261 scoped_ptr<HostSignalingManager> CreateHostSignalingManager(); 317 scoped_ptr<HostSignalingManager> CreateHostSignalingManager();
262 318
263 void StartHostIfReady(); 319 void StartHostIfReady();
264 void StartHost(); 320 void StartHost();
265 321
266 // Overrides for HostSignalingManager::Listener interface. 322 // Overrides for HostSignalingManager::Listener interface.
267 void OnHeartbeatSuccessful() override; 323 void OnHeartbeatSuccessful() override;
268 void OnUnknownHostIdError() override; 324 void OnUnknownHostIdError() override;
269 void OnAuthFailed() override; 325 void OnAuthFailed() override;
270 326
271 void RestartHost(); 327 void RestartHost(const std::string& host_offline_reason);
272
273 // Stops the host and shuts down the process with the specified |exit_code|.
274 void ShutdownHost(HostExitCodes exit_code); 328 void ShutdownHost(HostExitCodes exit_code);
275 329
276 // Private helper used by ShutdownHost method to initiate sending of 330 // Helper methods doing the work needed by RestartHost and ShutdownHost.
277 // host-offline-reason before continuing shutdown. 331 void GoOffline(const std::string& host_offline_reason);
278 void SendOfflineReasonAndShutdownOnNetworkThread(HostExitCodes exit_code); 332 void OnHostOfflineReasonAck(bool success);
279
280 void ShutdownOnNetworkThread();
281 333
282 #if defined(OS_WIN) 334 #if defined(OS_WIN)
283 // Initializes the pairing registry on Windows. This should be invoked on the 335 // Initializes the pairing registry on Windows. This should be invoked on the
284 // network thread. 336 // network thread.
285 void InitializePairingRegistry( 337 void InitializePairingRegistry(
286 IPC::PlatformFileForTransit privileged_key, 338 IPC::PlatformFileForTransit privileged_key,
287 IPC::PlatformFileForTransit unprivileged_key); 339 IPC::PlatformFileForTransit unprivileged_key);
288 #endif // defined(OS_WIN) 340 #endif // defined(OS_WIN)
289 341
290 // Crashes the process in response to a daemon's request. The daemon passes 342 // Crashes the process in response to a daemon's request. The daemon passes
(...skipping 27 matching lines...) Expand all
318 scoped_refptr<RsaKeyPair> key_pair_; 370 scoped_refptr<RsaKeyPair> key_pair_;
319 std::string oauth_refresh_token_; 371 std::string oauth_refresh_token_;
320 std::string serialized_config_; 372 std::string serialized_config_;
321 std::string host_owner_; 373 std::string host_owner_;
322 std::string host_owner_email_; 374 std::string host_owner_email_;
323 bool use_service_account_; 375 bool use_service_account_;
324 bool enable_vp9_; 376 bool enable_vp9_;
325 int64_t frame_recorder_buffer_size_; 377 int64_t frame_recorder_buffer_size_;
326 378
327 scoped_ptr<PolicyWatcher> policy_watcher_; 379 scoped_ptr<PolicyWatcher> policy_watcher_;
328 bool policies_loaded_; 380 PolicyState policy_state_;
329 std::string host_domain_; 381 std::string host_domain_;
330 bool host_username_match_required_; 382 bool host_username_match_required_;
331 bool allow_nat_traversal_; 383 bool allow_nat_traversal_;
332 bool allow_relay_; 384 bool allow_relay_;
333 uint16 min_udp_port_; 385 uint16 min_udp_port_;
334 uint16 max_udp_port_; 386 uint16 max_udp_port_;
335 std::string talkgadget_prefix_; 387 std::string talkgadget_prefix_;
336 bool allow_pairing_; 388 bool allow_pairing_;
337 389
338 bool curtain_required_; 390 bool curtain_required_;
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
370 422
371 ShutdownWatchdog* shutdown_watchdog_; 423 ShutdownWatchdog* shutdown_watchdog_;
372 424
373 DISALLOW_COPY_AND_ASSIGN(HostProcess); 425 DISALLOW_COPY_AND_ASSIGN(HostProcess);
374 }; 426 };
375 427
376 HostProcess::HostProcess(scoped_ptr<ChromotingHostContext> context, 428 HostProcess::HostProcess(scoped_ptr<ChromotingHostContext> context,
377 int* exit_code_out, 429 int* exit_code_out,
378 ShutdownWatchdog* shutdown_watchdog) 430 ShutdownWatchdog* shutdown_watchdog)
379 : context_(context.Pass()), 431 : context_(context.Pass()),
380 state_(HOST_INITIALIZING), 432 state_(HOST_STARTING),
381 use_service_account_(false), 433 use_service_account_(false),
382 enable_vp9_(false), 434 enable_vp9_(false),
383 frame_recorder_buffer_size_(0), 435 frame_recorder_buffer_size_(0),
384 policies_loaded_(false), 436 policy_state_(POLICY_INITIALIZING),
385 host_username_match_required_(false), 437 host_username_match_required_(false),
386 allow_nat_traversal_(true), 438 allow_nat_traversal_(true),
387 allow_relay_(true), 439 allow_relay_(true),
388 min_udp_port_(0), 440 min_udp_port_(0),
389 max_udp_port_(0), 441 max_udp_port_(0),
390 allow_pairing_(true), 442 allow_pairing_(true),
391 curtain_required_(false), 443 curtain_required_(false),
392 enable_gnubby_auth_(false), 444 enable_gnubby_auth_(false),
393 enable_window_capture_(false), 445 enable_window_capture_(false),
394 window_id_(0), 446 window_id_(0),
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
544 ShutdownHost(kInvalidHostConfigurationExitCode); 596 ShutdownHost(kInvalidHostConfigurationExitCode);
545 return; 597 return;
546 } 598 }
547 599
548 if (!ApplyConfig(*config)) { 600 if (!ApplyConfig(*config)) {
549 LOG(ERROR) << "Failed to apply the configuration."; 601 LOG(ERROR) << "Failed to apply the configuration.";
550 ShutdownHost(kInvalidHostConfigurationExitCode); 602 ShutdownHost(kInvalidHostConfigurationExitCode);
551 return; 603 return;
552 } 604 }
553 605
554 if (state_ == HOST_INITIALIZING) { 606 if (state_ == HOST_STARTING) {
555 StartHostIfReady(); 607 StartHostIfReady();
556 } else if (state_ == HOST_STARTED) { 608 } else if (state_ == HOST_STARTED) {
557 DCHECK(policies_loaded_);
558
559 // Reapply policies that could be affected by a new config. 609 // Reapply policies that could be affected by a new config.
610 DCHECK_EQ(policy_state_, POLICY_LOADED);
560 ApplyHostDomainPolicy(); 611 ApplyHostDomainPolicy();
561 ApplyUsernamePolicy(); 612 ApplyUsernamePolicy();
562 613
563 // TODO(sergeyu): Here we assume that PIN is the only part of the config 614 // TODO(sergeyu): Here we assume that PIN is the only part of the config
564 // that may change while the service is running. Change ApplyConfig() to 615 // that may change while the service is running. Change ApplyConfig() to
565 // detect other changes in the config and restart host if necessary here. 616 // detect other changes in the config and restart host if necessary here.
566 CreateAuthenticatorFactory(); 617 CreateAuthenticatorFactory();
567 } 618 }
568 } 619 }
569 620
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
779 FROM_HERE, 830 FROM_HERE,
780 base::Bind(&HostProcess::StartOnNetworkThread, this)); 831 base::Bind(&HostProcess::StartOnNetworkThread, this));
781 } 832 }
782 833
783 void HostProcess::ShutdownOnUiThread() { 834 void HostProcess::ShutdownOnUiThread() {
784 DCHECK(context_->ui_task_runner()->BelongsToCurrentThread()); 835 DCHECK(context_->ui_task_runner()->BelongsToCurrentThread());
785 836
786 // Tear down resources that need to be torn down on the UI thread. 837 // Tear down resources that need to be torn down on the UI thread.
787 daemon_channel_.reset(); 838 daemon_channel_.reset();
788 desktop_environment_factory_.reset(); 839 desktop_environment_factory_.reset();
789
790 policy_watcher_.reset(); 840 policy_watcher_.reset();
791 841
792 // It is now safe for the HostProcess to be deleted. 842 // It is now safe for the HostProcess to be deleted.
793 self_ = nullptr; 843 self_ = nullptr;
794 844
795 #if defined(OS_LINUX) 845 #if defined(OS_LINUX)
796 // Cause the global AudioPipeReader to be freed, otherwise the audio 846 // Cause the global AudioPipeReader to be freed, otherwise the audio
797 // thread will remain in-use and prevent the process from exiting. 847 // thread will remain in-use and prevent the process from exiting.
798 // TODO(wez): DesktopEnvironmentFactory should own the pipe reader. 848 // TODO(wez): DesktopEnvironmentFactory should own the pipe reader.
799 // See crbug.com/161373 and crbug.com/104544. 849 // See crbug.com/161373 and crbug.com/104544.
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
974 // Note: UsernamePolicyUpdate must run after OnCurtainPolicyUpdate. 1024 // Note: UsernamePolicyUpdate must run after OnCurtainPolicyUpdate.
975 restart_required |= OnUsernamePolicyUpdate(policies.get()); 1025 restart_required |= OnUsernamePolicyUpdate(policies.get());
976 restart_required |= OnNatPolicyUpdate(policies.get()); 1026 restart_required |= OnNatPolicyUpdate(policies.get());
977 restart_required |= OnRelayPolicyUpdate(policies.get()); 1027 restart_required |= OnRelayPolicyUpdate(policies.get());
978 restart_required |= OnUdpPortPolicyUpdate(policies.get()); 1028 restart_required |= OnUdpPortPolicyUpdate(policies.get());
979 restart_required |= OnHostTalkGadgetPrefixPolicyUpdate(policies.get()); 1029 restart_required |= OnHostTalkGadgetPrefixPolicyUpdate(policies.get());
980 restart_required |= OnHostTokenUrlPolicyUpdate(policies.get()); 1030 restart_required |= OnHostTokenUrlPolicyUpdate(policies.get());
981 restart_required |= OnPairingPolicyUpdate(policies.get()); 1031 restart_required |= OnPairingPolicyUpdate(policies.get());
982 restart_required |= OnGnubbyAuthPolicyUpdate(policies.get()); 1032 restart_required |= OnGnubbyAuthPolicyUpdate(policies.get());
983 1033
984 policies_loaded_ = true; 1034 policy_state_ = POLICY_LOADED;
985 1035
986 if (state_ == HOST_INITIALIZING) { 1036 if (state_ == HOST_STARTING) {
987 StartHostIfReady(); 1037 StartHostIfReady();
988 } else if (state_ == HOST_STARTED) { 1038 } else if (state_ == HOST_STARTED) {
989 if (restart_required) 1039 if (restart_required)
990 RestartHost(); 1040 RestartHost(kHostOfflineReasonPolicyChangeRequiresRestart);
991 } 1041 }
992 } 1042 }
993 1043
994 void HostProcess::OnPolicyError() { 1044 void HostProcess::OnPolicyError() {
995 if (!context_->network_task_runner()->BelongsToCurrentThread()) { 1045 if (!context_->network_task_runner()->BelongsToCurrentThread()) {
996 context_->network_task_runner()->PostTask( 1046 context_->network_task_runner()->PostTask(
997 FROM_HERE, base::Bind(&HostProcess::OnPolicyError, this)); 1047 FROM_HERE, base::Bind(&HostProcess::OnPolicyError, this));
998 return; 1048 return;
999 } 1049 }
1000 1050
1001 ShutdownHost(kInvalidHostConfigurationExitCode); 1051 if (policy_state_ != POLICY_ERROR_REPORTED) {
1052 policy_state_ = POLICY_ERROR_REPORT_PENDING;
1053 if (((state_ == HOST_STARTING) || (state_ == HOST_STARTED)) &&
Sergey Ulanov 2015/02/18 00:28:31 nit: IMO these extra parentheses around == operati
Sergey Ulanov 2015/02/18 00:28:31 Maybe move these checks into ReportPolicyErrorAndR
Łukasz Anforowicz 2015/02/18 17:03:11 Done.
Łukasz Anforowicz 2015/02/18 17:03:11 I've added a DCHECK(!serialized_config.empty()) to
1054 (!serialized_config_.empty())) {
1055 ReportPolicyErrorAndRestartHost();
1056 }
1057 }
1058 }
1059
1060 void HostProcess::ReportPolicyErrorAndRestartHost() {
1061 DCHECK(context_->network_task_runner()->BelongsToCurrentThread());
1062
1063 DCHECK_EQ(policy_state_, POLICY_ERROR_REPORT_PENDING);
1064 policy_state_ = POLICY_ERROR_REPORTED;
1065
1066 LOG(INFO) << "Restarting the host due to policy errors.";
1067 RestartHost(kHostOfflineReasonPolicyReadError);
1002 } 1068 }
1003 1069
1004 void HostProcess::ApplyHostDomainPolicy() { 1070 void HostProcess::ApplyHostDomainPolicy() {
1005 if (state_ != HOST_STARTED) 1071 if (state_ != HOST_STARTED)
1006 return; 1072 return;
1007 1073
1008 HOST_LOG << "Policy sets host domain: " << host_domain_; 1074 HOST_LOG << "Policy sets host domain: " << host_domain_;
1009 1075
1010 if (!host_domain_.empty()) { 1076 if (!host_domain_.empty()) {
1011 // If the user does not have a Google email, their client JID will not be 1077 // If the user does not have a Google email, their client JID will not be
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after
1293 } 1359 }
1294 1360
1295 scoped_ptr<HostSignalingManager> HostProcess::CreateHostSignalingManager() { 1361 scoped_ptr<HostSignalingManager> HostProcess::CreateHostSignalingManager() {
1296 DCHECK(!host_id_.empty()); // |ApplyConfig| should already have been run. 1362 DCHECK(!host_id_.empty()); // |ApplyConfig| should already have been run.
1297 1363
1298 scoped_ptr<OAuthTokenGetter::OAuthCredentials> oauth_credentials( 1364 scoped_ptr<OAuthTokenGetter::OAuthCredentials> oauth_credentials(
1299 new OAuthTokenGetter::OAuthCredentials(xmpp_server_config_.username, 1365 new OAuthTokenGetter::OAuthCredentials(xmpp_server_config_.username,
1300 oauth_refresh_token_, 1366 oauth_refresh_token_,
1301 use_service_account_)); 1367 use_service_account_));
1302 1368
1303 return HostSignalingManager::Create(this, context_->network_task_runner(), 1369 return HostSignalingManager::Create(
1304 context_->url_request_context_getter(), 1370 this, context_->url_request_context_getter(), xmpp_server_config_,
1305 xmpp_server_config_, talkgadget_prefix_, 1371 talkgadget_prefix_, host_id_, key_pair_, directory_bot_jid_,
1306 host_id_, key_pair_, directory_bot_jid_, 1372 oauth_credentials.Pass());
1307 oauth_credentials.Pass());
1308 } 1373 }
1309 1374
1310 void HostProcess::StartHostIfReady() { 1375 void HostProcess::StartHostIfReady() {
1311 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); 1376 DCHECK(context_->network_task_runner()->BelongsToCurrentThread());
1312 DCHECK_EQ(state_, HOST_INITIALIZING); 1377 DCHECK_EQ(state_, HOST_STARTING);
1313 1378
1314 // Start the host if both the config and the policies are loaded. 1379 // Start the host if both the config and the policies are loaded.
1315 if (!serialized_config_.empty() && policies_loaded_) 1380 if (!serialized_config_.empty()) {
1316 StartHost(); 1381 if (policy_state_ == POLICY_LOADED) {
1382 StartHost();
1383 } else if (policy_state_ == POLICY_ERROR_REPORT_PENDING) {
1384 ReportPolicyErrorAndRestartHost();
1385 }
1386 }
1317 } 1387 }
1318 1388
1319 void HostProcess::StartHost() { 1389 void HostProcess::StartHost() {
1320 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); 1390 DCHECK(context_->network_task_runner()->BelongsToCurrentThread());
1321 DCHECK(!host_); 1391 DCHECK(!host_);
1322 DCHECK(!host_signaling_manager_); 1392 DCHECK(!host_signaling_manager_);
1323 1393
1324 DCHECK(state_ == HOST_INITIALIZING || state_ == HOST_STOPPING_TO_RESTART || 1394 SetState(HOST_STARTED);
1325 state_ == HOST_STOPPED)
1326 << "state_ = " << state_;
1327 state_ = HOST_STARTED;
1328 1395
1329 host_signaling_manager_ = CreateHostSignalingManager(); 1396 host_signaling_manager_ = CreateHostSignalingManager();
1330 1397
1331 uint32 network_flags = 0; 1398 uint32 network_flags = 0;
1332 if (allow_nat_traversal_) { 1399 if (allow_nat_traversal_) {
1333 network_flags = NetworkSettings::NAT_TRAVERSAL_STUN | 1400 network_flags = NetworkSettings::NAT_TRAVERSAL_STUN |
1334 NetworkSettings::NAT_TRAVERSAL_OUTGOING; 1401 NetworkSettings::NAT_TRAVERSAL_OUTGOING;
1335 if (allow_relay_) 1402 if (allow_relay_)
1336 network_flags |= NetworkSettings::NAT_TRAVERSAL_RELAY; 1403 network_flags |= NetworkSettings::NAT_TRAVERSAL_RELAY;
1337 } 1404 }
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
1402 CreateAuthenticatorFactory(); 1469 CreateAuthenticatorFactory();
1403 1470
1404 ApplyHostDomainPolicy(); 1471 ApplyHostDomainPolicy();
1405 ApplyUsernamePolicy(); 1472 ApplyUsernamePolicy();
1406 } 1473 }
1407 1474
1408 void HostProcess::OnAuthFailed() { 1475 void HostProcess::OnAuthFailed() {
1409 ShutdownHost(kInvalidOauthCredentialsExitCode); 1476 ShutdownHost(kInvalidOauthCredentialsExitCode);
1410 } 1477 }
1411 1478
1412 void HostProcess::RestartHost() { 1479 void HostProcess::RestartHost(const std::string& host_offline_reason) {
1413 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); 1480 DCHECK(context_->network_task_runner()->BelongsToCurrentThread());
1414 DCHECK_EQ(state_, HOST_STARTED); 1481 DCHECK(!host_offline_reason.empty());
1415 1482
1416 state_ = HOST_STOPPING_TO_RESTART; 1483 SetState(HOST_GOING_OFFLINE_TO_RESTART);
1417 ShutdownOnNetworkThread(); 1484 GoOffline(host_offline_reason);
1418 }
1419
1420 void HostProcess::SendOfflineReasonAndShutdownOnNetworkThread(
1421 HostExitCodes exit_code) {
1422 DCHECK(context_->network_task_runner()->BelongsToCurrentThread());
1423 DCHECK(host_signaling_manager_);
1424 host_signaling_manager_.release()->SendHostOfflineReasonAndDelete(
1425 ExitCodeToString(exit_code),
1426 base::TimeDelta::FromSeconds(kHostOfflineReasonTimeoutSeconds));
1427 ShutdownOnNetworkThread();
1428 } 1485 }
1429 1486
1430 void HostProcess::ShutdownHost(HostExitCodes exit_code) { 1487 void HostProcess::ShutdownHost(HostExitCodes exit_code) {
1431 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); 1488 DCHECK(context_->network_task_runner()->BelongsToCurrentThread());
1432 1489
1433 *exit_code_out_ = exit_code; 1490 *exit_code_out_ = exit_code;
1434 1491
1435 switch (state_) { 1492 switch (state_) {
1436 case HOST_INITIALIZING: 1493 case HOST_STARTING:
1437 state_ = HOST_STOPPING; 1494 case HOST_STARTED:
1438 DCHECK(!host_signaling_manager_); 1495 SetState(HOST_GOING_OFFLINE_TO_STOP);
1439 host_signaling_manager_ = CreateHostSignalingManager(); 1496 GoOffline(ExitCodeToString(exit_code));
1440 SendOfflineReasonAndShutdownOnNetworkThread(exit_code);
1441 break; 1497 break;
1442 1498
1443 case HOST_STARTED: 1499 case HOST_GOING_OFFLINE_TO_RESTART:
1444 state_ = HOST_STOPPING; 1500 SetState(HOST_GOING_OFFLINE_TO_STOP);
1445 SendOfflineReasonAndShutdownOnNetworkThread(exit_code);
1446 break; 1501 break;
1447 1502
1448 case HOST_STOPPING_TO_RESTART: 1503 case HOST_GOING_OFFLINE_TO_STOP:
1449 state_ = HOST_STOPPING;
1450 break;
1451
1452 case HOST_STOPPING:
1453 case HOST_STOPPED: 1504 case HOST_STOPPED:
1454 // Host is already stopped or being stopped. No action is required. 1505 // Host is already stopped or being stopped. No action is required.
1455 break; 1506 break;
1456 } 1507 }
1457 } 1508 }
1458 1509
1459 void HostProcess::ShutdownOnNetworkThread() { 1510 void HostProcess::GoOffline(const std::string& host_offline_reason) {
1460 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); 1511 DCHECK(context_->network_task_runner()->BelongsToCurrentThread());
1512 DCHECK(!host_offline_reason.empty());
1513 DCHECK((state_ == HOST_GOING_OFFLINE_TO_STOP) ||
1514 (state_ == HOST_GOING_OFFLINE_TO_RESTART));
1461 1515
1516 // Shut down everything except the HostSignalingManager.
1462 host_.reset(); 1517 host_.reset();
1463 host_event_logger_.reset(); 1518 host_event_logger_.reset();
1464 host_status_logger_.reset(); 1519 host_status_logger_.reset();
1465 host_signaling_manager_.reset();
1466 host_change_notification_listener_.reset(); 1520 host_change_notification_listener_.reset();
1467 1521
1468 if (state_ == HOST_STOPPING_TO_RESTART) { 1522 // Before shutting down HostSignalingManager, send the |host_offline_reason|
1469 StartHost(); 1523 // if possible (i.e. if we have the config).
1470 } else if (state_ == HOST_STOPPING) { 1524 if (!serialized_config_.empty()) {
1471 state_ = HOST_STOPPED; 1525 if (!host_signaling_manager_) {
1526 host_signaling_manager_ = CreateHostSignalingManager();
1527 }
1528
1529 host_signaling_manager_->SendHostOfflineReason(
1530 host_offline_reason,
1531 base::TimeDelta::FromSeconds(kHostOfflineReasonTimeoutSeconds),
1532 base::Bind(&HostProcess::OnHostOfflineReasonAck, this));
1533 return; // Shutdown will resume after OnHostOfflineReasonAck.
1534 }
1535
1536 // Continue the shutdown without sending the host offline reason.
1537 HOST_LOG << "SendHostOfflineReason( " << host_offline_reason << ") "
Sergey Ulanov 2015/02/18 00:28:31 Maybe something like "Can't send offline reason (<
Łukasz Anforowicz 2015/02/18 17:03:11 Done.
1538 << "not possible without a config...";
1539 OnHostOfflineReasonAck(false);
1540 }
1541
1542 void HostProcess::OnHostOfflineReasonAck(bool success) {
1543 DCHECK(context_->network_task_runner()->BelongsToCurrentThread());
1544 DCHECK(!host_); // Assert that the host is really offline at this point.
1545
1546 HOST_LOG << "SendHostOfflineReason " << (success ? "succeeded." : "failed.");
1547 host_signaling_manager_.reset();
1548
1549 if (state_ == HOST_GOING_OFFLINE_TO_RESTART) {
1550 SetState(HOST_STARTING);
1551 StartHostIfReady();
1552 } else if (state_ == HOST_GOING_OFFLINE_TO_STOP) {
1553 SetState(HOST_STOPPED);
1472 1554
1473 shutdown_watchdog_->SetExitCode(*exit_code_out_); 1555 shutdown_watchdog_->SetExitCode(*exit_code_out_);
1474 shutdown_watchdog_->Arm(); 1556 shutdown_watchdog_->Arm();
1475 1557
1476 config_watcher_.reset(); 1558 config_watcher_.reset();
1477 1559
1478 // Complete the rest of shutdown on the main thread. 1560 // Complete the rest of shutdown on the main thread.
1479 context_->ui_task_runner()->PostTask( 1561 context_->ui_task_runner()->PostTask(
1480 FROM_HERE, base::Bind(&HostProcess::ShutdownOnUiThread, this)); 1562 FROM_HERE, base::Bind(&HostProcess::ShutdownOnUiThread, this));
1481 } else { 1563 } else {
1482 // This method is only called in STOPPING_TO_RESTART and STOPPING states.
1483 NOTREACHED(); 1564 NOTREACHED();
1484 } 1565 }
1485 } 1566 }
1486 1567
1487 void HostProcess::OnCrash(const std::string& function_name, 1568 void HostProcess::OnCrash(const std::string& function_name,
1488 const std::string& file_name, 1569 const std::string& file_name,
1489 const int& line_number) { 1570 const int& line_number) {
1490 char message[1024]; 1571 char message[1024];
1491 base::snprintf(message, sizeof(message), 1572 base::snprintf(message, sizeof(message),
1492 "Requested by %s at %s, line %d.", 1573 "Requested by %s at %s, line %d.",
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1542 base::TimeDelta::FromSeconds(kShutdownTimeoutSeconds)); 1623 base::TimeDelta::FromSeconds(kShutdownTimeoutSeconds));
1543 new HostProcess(context.Pass(), &exit_code, &shutdown_watchdog); 1624 new HostProcess(context.Pass(), &exit_code, &shutdown_watchdog);
1544 1625
1545 // Run the main (also UI) message loop until the host no longer needs it. 1626 // Run the main (also UI) message loop until the host no longer needs it.
1546 message_loop.Run(); 1627 message_loop.Run();
1547 1628
1548 return exit_code; 1629 return exit_code;
1549 } 1630 }
1550 1631
1551 } // namespace remoting 1632 } // namespace remoting
OLDNEW
« no previous file with comments | « remoting/host/policy_watcher.cc ('k') | remoting/resources/remoting_strings.grd » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698