blob: 9c06e7b0c3f4b38bff8691f070a5542510c17e37 [file] [log] [blame]
// 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