| // Copyright 2023 The ChromiumOS Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "patchpanel/patchpanel_daemon.h" |
| |
| #include <sys/prctl.h> |
| |
| #include <utility> |
| |
| #include <base/logging.h> |
| #include <chromeos/dbus/service_constants.h> |
| #include <chromeos/net-base/process_manager.h> |
| #include <metrics/metrics_library.h> |
| |
| #include "patchpanel/metrics.h" |
| #include "patchpanel/patchpanel_adaptor.h" |
| #include "patchpanel/rtnl_client.h" |
| #include "patchpanel/system.h" |
| |
| namespace patchpanel { |
| |
| PatchpanelDaemon::PatchpanelDaemon(const base::FilePath& cmd_path) |
| : DBusServiceDaemon(kPatchPanelServiceName), |
| cmd_path_(cmd_path), |
| system_(std::make_unique<System>()), |
| process_manager_(net_base::ProcessManager::GetInstance()), |
| metrics_(std::make_unique<MetricsLibrary>()) {} |
| |
| void PatchpanelDaemon::RegisterDBusObjectsAsync( |
| brillo::dbus_utils::AsyncEventSequencer* sequencer) { |
| prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); |
| |
| // Initialize |process_manager_| before creating subprocesses. |
| process_manager_->Init(); |
| |
| auto rtnl_client = RTNLClient::Create(); |
| if (!rtnl_client) { |
| LOG(ERROR) << "Failed to create RTNLClient, abort registering the adaptor"; |
| return; |
| } |
| |
| adaptor_ = std::make_unique<PatchpanelAdaptor>( |
| cmd_path_, bus_, system_.get(), process_manager_, metrics_.get(), |
| std::move(rtnl_client)); |
| adaptor_->RegisterAsync( |
| sequencer->GetHandler("RegisterAsync() failed", true)); |
| } |
| |
| void PatchpanelDaemon::OnShutdown(int* exit_code) { |
| LOG(INFO) << "Shutting down and cleaning up"; |
| |
| adaptor_.reset(); |
| |
| // Stop |process_manager_| after subprocesses are finished. |
| process_manager_->Stop(); |
| |
| if (bus_) { |
| bus_->ShutdownAndBlock(); |
| } |
| brillo::DBusDaemon::OnShutdown(exit_code); |
| } |
| |
| } // namespace patchpanel |