blob: 868a6c64ca78d106450b18bae892d18a36f2d1ea [file] [log] [blame] [edit]
// 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 <memory>
#include <base/at_exit.h>
#include <base/task/single_thread_task_executor.h>
#include <base/files/file_descriptor_watcher_posix.h>
#include <base/functional/bind.h>
#include <base/check.h>
#include <base/logging.h>
#include <base/run_loop.h>
#include <brillo/flag_helper.h>
#include <dbus/bus.h>
#include "modemloggerd/dbus_bindings/modemloggerd-proxies.h"
#include "modemloggerd/dbus-constants.h"
void RunAction(const scoped_refptr<dbus::Bus>& bus,
const dbus::ObjectPath& modem_path,
const std::string& action) {
org::chromium::Modemloggerd::ModemProxy modem_proxy(
bus, modemloggerd::kModemloggerdServiceName, modem_path);
brillo::ErrorPtr error;
if (action == "start") {
modem_proxy.SetEnabled(true, &error);
CHECK(!error) << error->GetMessage();
modem_proxy.Start(&error);
CHECK(!error) << error->GetMessage();
} else if (action == "stop") {
modem_proxy.Stop(&error);
CHECK(!error) << error->GetMessage();
modem_proxy.SetEnabled(false, &error);
CHECK(!error) << error->GetMessage();
} else if (action == "set_auto_start") {
modem_proxy.SetEnabled(true, &error);
CHECK(!error) << error->GetMessage();
modem_proxy.SetAutoStart(true, &error);
CHECK(!error) << error->GetMessage();
} else if (action == "clear_auto_start") {
modem_proxy.SetAutoStart(false, &error);
CHECK(!error) << error->GetMessage();
} else {
LOG(FATAL) << "Invalid action \"" << action << "\"";
}
LOG(INFO) << "Success";
exit(0);
}
void OnPropertiesChanged(
const scoped_refptr<dbus::Bus>& bus,
const std::string& action,
org::chromium::Modemloggerd::ManagerProxyInterface* manager_proxy_interface,
const std::string& prop) {
if (prop != manager_proxy_interface->AvailableModemsName()) {
return;
}
CHECK(manager_proxy_interface->is_available_modems_valid());
if (manager_proxy_interface->available_modems().empty()) {
LOG(FATAL) << "No logging capable modem found";
}
LOG(INFO) << "Found logging capable modem: "
<< manager_proxy_interface->available_modems()[0].value();
LOG(INFO) << "Default logs directory: /var/log/modemloggerd/";
RunAction(bus, manager_proxy_interface->available_modems()[0], action);
}
int main(int argc, char* argv[]) {
DEFINE_string(action, "",
"logging related action to perform (one of "
"set_auto_start, clear_auto_start, start, stop)");
brillo::FlagHelper::Init(argc, argv,
"Configures the modem for logging via modemloggerd");
base::SingleThreadTaskExecutor task_executor(base::MessagePumpType::IO);
base::FileDescriptorWatcher watcher(task_executor.task_runner());
dbus::Bus::Options options;
options.bus_type = dbus::Bus::SYSTEM;
scoped_refptr<dbus::Bus> bus(new dbus::Bus(options));
CHECK(bus->Connect());
org::chromium::Modemloggerd::ManagerProxy manager_proxy(
bus, modemloggerd::kModemloggerdServiceName);
auto on_props_available_cb = base::BindRepeating(
&OnPropertiesChanged, std::move(bus), std::move(FLAGS_action));
manager_proxy.InitializeProperties(std::move(on_props_available_cb));
base::RunLoop().Run();
return 0;
}