| // Copyright 2018 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "debugd/src/simple_service_tool.h" |
| |
| #include <utility> |
| |
| #include <base/bind.h> |
| #include <base/callback_helpers.h> |
| #include <base/check.h> |
| #include <base/location.h> |
| #include <base/logging.h> |
| #include <brillo/process/process.h> |
| #include <dbus/object_path.h> |
| |
| using std::string; |
| |
| namespace debugd { |
| namespace { |
| |
| // Posted to the MessageLoop by dbus::ObjectProxy once the concierge |
| // service is available on dbus. |
| void ServiceReady( |
| std::unique_ptr<brillo::dbus_utils::DBusMethodResponse<bool>> response, |
| bool is_available) { |
| response->Return(is_available); |
| } |
| |
| } // namespace |
| |
| SimpleServiceTool::SimpleServiceTool(const std::string& name, |
| scoped_refptr<dbus::Bus> bus, |
| const std::string& dbus_service_name, |
| const std::string& dbus_service_path) |
| : name_(name), bus_(bus), running_(false) { |
| CHECK(bus_); |
| |
| proxy_ = bus_->GetObjectProxy(dbus_service_name, |
| dbus::ObjectPath(dbus_service_path)); |
| proxy_->SetNameOwnerChangedCallback(base::BindRepeating( |
| &SimpleServiceTool::HandleNameOwnerChanged, weak_factory_.GetWeakPtr())); |
| } |
| |
| void SimpleServiceTool::StartService( |
| std::map<std::string, std::string> args, |
| std::unique_ptr<brillo::dbus_utils::DBusMethodResponse<bool>> response) { |
| if (running_) { |
| response->Return(true); |
| return; |
| } |
| |
| LOG(INFO) << "Starting " << name_; |
| brillo::ProcessImpl service; |
| service.AddArg("/sbin/start"); |
| service.AddArg(name_); |
| for (const auto& arg : args) { |
| service.AddArg( |
| base::StringPrintf("%s=%s", arg.first.c_str(), arg.second.c_str())); |
| } |
| service.Run(); |
| |
| // dbus::ObjectProxy keeps a list of WaitForServiceToBeAvailable |
| // callbacks so we can safely call this multiple times if there are multiple |
| // pending dbus requests. |
| proxy_->WaitForServiceToBeAvailable( |
| base::BindOnce(&ServiceReady, std::move(response))); |
| } |
| |
| void SimpleServiceTool::StopService() { |
| if (!running_) { |
| // Nothing to do. |
| return; |
| } |
| |
| LOG(INFO) << "Stopping " << name_; |
| |
| brillo::ProcessImpl service; |
| service.AddArg("/sbin/stop"); |
| service.AddArg(name_); |
| |
| service.Run(); |
| } |
| |
| void SimpleServiceTool::HandleNameOwnerChanged(const string& old_owner, |
| const string& new_owner) { |
| running_ = !new_owner.empty(); |
| } |
| |
| } // namespace debugd |