| OLD | NEW |
| 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 #include "remoting/host/setup/daemon_controller.h" | 5 #include "remoting/host/setup/daemon_controller.h" |
| 6 | 6 |
| 7 #include <unistd.h> | 7 #include <unistd.h> |
| 8 | 8 |
| 9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 61 const CompletionCallback& done) OVERRIDE; | 61 const CompletionCallback& done) OVERRIDE; |
| 62 virtual void UpdateConfig(scoped_ptr<base::DictionaryValue> config, | 62 virtual void UpdateConfig(scoped_ptr<base::DictionaryValue> config, |
| 63 const CompletionCallback& done_callback) OVERRIDE; | 63 const CompletionCallback& done_callback) OVERRIDE; |
| 64 virtual void Stop(const CompletionCallback& done_callback) OVERRIDE; | 64 virtual void Stop(const CompletionCallback& done_callback) OVERRIDE; |
| 65 virtual void SetWindow(void* window_handle) OVERRIDE; | 65 virtual void SetWindow(void* window_handle) OVERRIDE; |
| 66 virtual void GetVersion(const GetVersionCallback& done_callback) OVERRIDE; | 66 virtual void GetVersion(const GetVersionCallback& done_callback) OVERRIDE; |
| 67 virtual void GetUsageStatsConsent( | 67 virtual void GetUsageStatsConsent( |
| 68 const GetUsageStatsConsentCallback& done) OVERRIDE; | 68 const GetUsageStatsConsentCallback& done) OVERRIDE; |
| 69 | 69 |
| 70 private: | 70 private: |
| 71 FilePath GetConfigPath(); | 71 base::FilePath GetConfigPath(); |
| 72 | 72 |
| 73 void DoGetConfig(const GetConfigCallback& callback); | 73 void DoGetConfig(const GetConfigCallback& callback); |
| 74 void DoSetConfigAndStart(scoped_ptr<base::DictionaryValue> config, | 74 void DoSetConfigAndStart(scoped_ptr<base::DictionaryValue> config, |
| 75 const CompletionCallback& done); | 75 const CompletionCallback& done); |
| 76 void DoUpdateConfig(scoped_ptr<base::DictionaryValue> config, | 76 void DoUpdateConfig(scoped_ptr<base::DictionaryValue> config, |
| 77 const CompletionCallback& done_callback); | 77 const CompletionCallback& done_callback); |
| 78 void DoStop(const CompletionCallback& done_callback); | 78 void DoStop(const CompletionCallback& done_callback); |
| 79 void DoGetVersion(const GetVersionCallback& done_callback); | 79 void DoGetVersion(const GetVersionCallback& done_callback); |
| 80 | 80 |
| 81 base::Thread file_io_thread_; | 81 base::Thread file_io_thread_; |
| 82 | 82 |
| 83 DISALLOW_COPY_AND_ASSIGN(DaemonControllerLinux); | 83 DISALLOW_COPY_AND_ASSIGN(DaemonControllerLinux); |
| 84 }; | 84 }; |
| 85 | 85 |
| 86 DaemonControllerLinux::DaemonControllerLinux() | 86 DaemonControllerLinux::DaemonControllerLinux() |
| 87 : file_io_thread_("DaemonControllerFileIO") { | 87 : file_io_thread_("DaemonControllerFileIO") { |
| 88 file_io_thread_.Start(); | 88 file_io_thread_.Start(); |
| 89 } | 89 } |
| 90 | 90 |
| 91 static bool GetScriptPath(FilePath* result) { | 91 static bool GetScriptPath(base::FilePath* result) { |
| 92 FilePath candidate_exe(kDaemonScript); | 92 base::FilePath candidate_exe(kDaemonScript); |
| 93 if (access(candidate_exe.value().c_str(), X_OK) == 0) { | 93 if (access(candidate_exe.value().c_str(), X_OK) == 0) { |
| 94 *result = candidate_exe; | 94 *result = candidate_exe; |
| 95 return true; | 95 return true; |
| 96 } | 96 } |
| 97 return false; | 97 return false; |
| 98 } | 98 } |
| 99 | 99 |
| 100 static bool RunHostScriptWithTimeout( | 100 static bool RunHostScriptWithTimeout( |
| 101 const std::vector<std::string>& args, | 101 const std::vector<std::string>& args, |
| 102 base::TimeDelta timeout, | 102 base::TimeDelta timeout, |
| 103 int* exit_code) { | 103 int* exit_code) { |
| 104 // As long as we're relying on running an external binary from the | 104 // As long as we're relying on running an external binary from the |
| 105 // PATH, don't do it as root. | 105 // PATH, don't do it as root. |
| 106 if (getuid() == 0) { | 106 if (getuid() == 0) { |
| 107 return false; | 107 return false; |
| 108 } | 108 } |
| 109 FilePath script_path; | 109 base::FilePath script_path; |
| 110 if (!GetScriptPath(&script_path)) { | 110 if (!GetScriptPath(&script_path)) { |
| 111 return false; | 111 return false; |
| 112 } | 112 } |
| 113 CommandLine command_line(script_path); | 113 CommandLine command_line(script_path); |
| 114 for (unsigned int i = 0; i < args.size(); ++i) { | 114 for (unsigned int i = 0; i < args.size(); ++i) { |
| 115 command_line.AppendArg(args[i]); | 115 command_line.AppendArg(args[i]); |
| 116 } | 116 } |
| 117 base::ProcessHandle process_handle; | 117 base::ProcessHandle process_handle; |
| 118 bool result = base::LaunchProcess(command_line, | 118 bool result = base::LaunchProcess(command_line, |
| 119 base::LaunchOptions(), | 119 base::LaunchOptions(), |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 193 // noop | 193 // noop |
| 194 } | 194 } |
| 195 | 195 |
| 196 void DaemonControllerLinux::GetVersion( | 196 void DaemonControllerLinux::GetVersion( |
| 197 const GetVersionCallback& done_callback) { | 197 const GetVersionCallback& done_callback) { |
| 198 file_io_thread_.message_loop()->PostTask(FROM_HERE, base::Bind( | 198 file_io_thread_.message_loop()->PostTask(FROM_HERE, base::Bind( |
| 199 &DaemonControllerLinux::DoGetVersion, base::Unretained(this), | 199 &DaemonControllerLinux::DoGetVersion, base::Unretained(this), |
| 200 done_callback)); | 200 done_callback)); |
| 201 } | 201 } |
| 202 | 202 |
| 203 FilePath DaemonControllerLinux::GetConfigPath() { | 203 base::FilePath DaemonControllerLinux::GetConfigPath() { |
| 204 std::string filename = "host#" + GetMd5(net::GetHostName()) + ".json"; | 204 std::string filename = "host#" + GetMd5(net::GetHostName()) + ".json"; |
| 205 return file_util::GetHomeDir(). | 205 return file_util::GetHomeDir(). |
| 206 Append(".config/chrome-remote-desktop").Append(filename); | 206 Append(".config/chrome-remote-desktop").Append(filename); |
| 207 } | 207 } |
| 208 | 208 |
| 209 void DaemonControllerLinux::DoGetConfig(const GetConfigCallback& callback) { | 209 void DaemonControllerLinux::DoGetConfig(const GetConfigCallback& callback) { |
| 210 scoped_ptr<base::DictionaryValue> result(new base::DictionaryValue()); | 210 scoped_ptr<base::DictionaryValue> result(new base::DictionaryValue()); |
| 211 | 211 |
| 212 if (GetState() != remoting::DaemonController::STATE_NOT_IMPLEMENTED) { | 212 if (GetState() != remoting::DaemonController::STATE_NOT_IMPLEMENTED) { |
| 213 JsonHostConfig config(GetConfigPath()); | 213 JsonHostConfig config(GetConfigPath()); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 238 if (!RunHostScriptWithTimeout( | 238 if (!RunHostScriptWithTimeout( |
| 239 args, base::TimeDelta::FromMilliseconds(kSudoTimeoutMs), | 239 args, base::TimeDelta::FromMilliseconds(kSudoTimeoutMs), |
| 240 &exit_code) || | 240 &exit_code) || |
| 241 exit_code != 0) { | 241 exit_code != 0) { |
| 242 LOG(ERROR) << "Failed to add user to chrome-remote-desktop group."; | 242 LOG(ERROR) << "Failed to add user to chrome-remote-desktop group."; |
| 243 done_callback.Run(RESULT_FAILED); | 243 done_callback.Run(RESULT_FAILED); |
| 244 return; | 244 return; |
| 245 } | 245 } |
| 246 | 246 |
| 247 // Ensure the configuration directory exists. | 247 // Ensure the configuration directory exists. |
| 248 FilePath config_dir = GetConfigPath().DirName(); | 248 base::FilePath config_dir = GetConfigPath().DirName(); |
| 249 if (!file_util::DirectoryExists(config_dir) && | 249 if (!file_util::DirectoryExists(config_dir) && |
| 250 !file_util::CreateDirectory(config_dir)) { | 250 !file_util::CreateDirectory(config_dir)) { |
| 251 LOG(ERROR) << "Failed to create config directory " << config_dir.value(); | 251 LOG(ERROR) << "Failed to create config directory " << config_dir.value(); |
| 252 done_callback.Run(RESULT_FAILED); | 252 done_callback.Run(RESULT_FAILED); |
| 253 return; | 253 return; |
| 254 } | 254 } |
| 255 | 255 |
| 256 // Write config. | 256 // Write config. |
| 257 JsonHostConfig config_file(GetConfigPath()); | 257 JsonHostConfig config_file(GetConfigPath()); |
| 258 if (!config_file.CopyFrom(config.get()) || | 258 if (!config_file.CopyFrom(config.get()) || |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 307 if (RunHostScript(args, &exit_code)) { | 307 if (RunHostScript(args, &exit_code)) { |
| 308 result = (exit_code == 0) ? RESULT_OK : RESULT_FAILED; | 308 result = (exit_code == 0) ? RESULT_OK : RESULT_FAILED; |
| 309 } else { | 309 } else { |
| 310 result = RESULT_FAILED; | 310 result = RESULT_FAILED; |
| 311 } | 311 } |
| 312 done_callback.Run(result); | 312 done_callback.Run(result); |
| 313 } | 313 } |
| 314 | 314 |
| 315 void DaemonControllerLinux::DoGetVersion( | 315 void DaemonControllerLinux::DoGetVersion( |
| 316 const GetVersionCallback& done_callback) { | 316 const GetVersionCallback& done_callback) { |
| 317 FilePath script_path; | 317 base::FilePath script_path; |
| 318 if (!GetScriptPath(&script_path)) { | 318 if (!GetScriptPath(&script_path)) { |
| 319 done_callback.Run(""); | 319 done_callback.Run(""); |
| 320 return; | 320 return; |
| 321 } | 321 } |
| 322 CommandLine command_line(script_path); | 322 CommandLine command_line(script_path); |
| 323 command_line.AppendArg("--host-version"); | 323 command_line.AppendArg("--host-version"); |
| 324 | 324 |
| 325 std::string version; | 325 std::string version; |
| 326 int exit_code = 0; | 326 int exit_code = 0; |
| 327 int result = | 327 int result = |
| (...skipping 15 matching lines...) Expand all Loading... |
| 343 done_callback.Run(version); | 343 done_callback.Run(version); |
| 344 } | 344 } |
| 345 | 345 |
| 346 } // namespace | 346 } // namespace |
| 347 | 347 |
| 348 scoped_ptr<DaemonController> remoting::DaemonController::Create() { | 348 scoped_ptr<DaemonController> remoting::DaemonController::Create() { |
| 349 return scoped_ptr<DaemonController>(new DaemonControllerLinux()); | 349 return scoped_ptr<DaemonController>(new DaemonControllerLinux()); |
| 350 } | 350 } |
| 351 | 351 |
| 352 } // namespace remoting | 352 } // namespace remoting |
| OLD | NEW |