buffet: Add ability to add commands via buffet_client
Implemented "AddCommand" parameter in buffet_client that queues
a GCD command in buffet daemon.
BUG=chromium:412583
TEST=FEATURES=test emerge-link buffet
Change-Id: Ie5a6561efc8675ba5fb234c1151a0f1dbda39e5d
Reviewed-on: https://chromium-review.googlesource.com/217829
Reviewed-by: Christopher Wiley <wiley@chromium.org>
Reviewed-by: Anton Muhin <antonm@chromium.org>
Commit-Queue: Alex Vakulenko <avakulenko@chromium.org>
Tested-by: Alex Vakulenko <avakulenko@chromium.org>
diff --git a/buffet/buffet_client.cc b/buffet/buffet_client.cc
index 38ea239..14636f8 100644
--- a/buffet/buffet_client.cc
+++ b/buffet/buffet_client.cc
@@ -37,6 +37,9 @@
<< " param1 = val1¶m2 = val2..." << std::endl;
std::cerr << " " << kManagerFinishRegisterDevice
<< " device_id" << std::endl;
+ std::cerr << " " << kManagerAddCommand
+ << " '{\"name\":\"command_name\",\"parameters\":{}}'"
+ << std::endl;
std::cerr << " " << kManagerUpdateStateMethod << std::endl;
std::cerr << " " << dbus::kObjectManagerGetManagedObjects << std::endl;
}
@@ -235,6 +238,26 @@
return EX_OK;
}
+ int CallManagerAddCommand(const CommandLine::StringVector& args) {
+ if (args.size() != 1) {
+ std::cerr << "Invalid number of arguments for "
+ << "Manager." << kManagerAddCommand << std::endl;
+ usage();
+ return EX_USAGE;
+ }
+ dbus::MethodCall method_call(
+ kManagerInterface, kManagerAddCommand);
+ dbus::MessageWriter writer(&method_call);
+ writer.AppendString(args.front());
+ scoped_ptr<dbus::Response> response(
+ manager_proxy_->CallMethodAndBlock(&method_call, default_timeout_ms));
+ if (!response) {
+ std::cout << "Failed to receive a response." << std::endl;
+ return EX_UNAVAILABLE;
+ }
+ return EX_OK;
+ }
+
int CallRootGetManagedObjects(const CommandLine::StringVector& args) {
if (!args.empty()) {
std::cerr << "Invalid number of arguments for "
@@ -299,6 +322,9 @@
} else if (command.compare(kManagerUpdateStateMethod) == 0 ||
command.compare("us") == 0) {
err = helper.CallManagerUpdateState(args);
+ } else if (command.compare(kManagerAddCommand) == 0 ||
+ command.compare("ac") == 0) {
+ err = helper.CallManagerAddCommand(args);
} else if (command.compare(dbus::kObjectManagerGetManagedObjects) == 0) {
err = helper.CallRootGetManagedObjects(args);
} else {
diff --git a/buffet/dbus_constants.cc b/buffet/dbus_constants.cc
index c3921f9..07b3b52 100644
--- a/buffet/dbus_constants.cc
+++ b/buffet/dbus_constants.cc
@@ -20,6 +20,7 @@
const char kManagerStartRegisterDevice[] = "StartRegisterDevice";
const char kManagerFinishRegisterDevice[] = "FinishRegisterDevice";
const char kManagerUpdateStateMethod[] = "UpdateState";
+const char kManagerAddCommand[] = "AddCommand";
const char kManagerTestMethod[] = "TestMethod";
const char kCommandInterface[] = "org.chromium.Buffet.Command";
diff --git a/buffet/dbus_constants.h b/buffet/dbus_constants.h
index 398f848..593866b 100644
--- a/buffet/dbus_constants.h
+++ b/buffet/dbus_constants.h
@@ -25,6 +25,7 @@
extern const char kManagerStartRegisterDevice[];
extern const char kManagerFinishRegisterDevice[];
extern const char kManagerUpdateStateMethod[];
+extern const char kManagerAddCommand[];
extern const char kManagerTestMethod[];
// Interface implemented by the command instance objects.
diff --git a/buffet/manager.cc b/buffet/manager.cc
index 7c3cbd5..3b0c4ef 100644
--- a/buffet/manager.cc
+++ b/buffet/manager.cc
@@ -9,6 +9,7 @@
#include <base/bind.h>
#include <base/bind_helpers.h>
+#include <base/json/json_reader.h>
#include <base/json/json_writer.h>
#include <chromeos/dbus/async_event_sequencer.h>
#include <chromeos/dbus/exported_object_manager.h>
@@ -17,6 +18,7 @@
#include <dbus/object_path.h>
#include <dbus/values_util.h>
+#include "buffet/commands/command_instance.h"
#include "buffet/commands/command_manager.h"
#include "buffet/dbus_constants.h"
@@ -48,6 +50,9 @@
itf->AddMethodHandler(dbus_constants::kManagerUpdateStateMethod,
base::Unretained(this),
&Manager::HandleUpdateState);
+ itf->AddMethodHandler(dbus_constants::kManagerAddCommand,
+ base::Unretained(this),
+ &Manager::HandleAddCommand);
itf->AddMethodHandler(dbus_constants::kManagerTestMethod,
base::Unretained(this),
&Manager::HandleTestMethod);
@@ -118,6 +123,22 @@
state_.SetValue(json_state_fragment);
}
+void Manager::HandleAddCommand(
+ chromeos::ErrorPtr* error, const std::string& json_command) {
+ std::string error_message;
+ std::unique_ptr<base::Value> value(base::JSONReader::ReadAndReturnError(
+ json_command, base::JSON_PARSE_RFC, nullptr, &error_message));
+ if (!value) {
+ chromeos::Error::AddTo(error, chromeos::errors::json::kDomain,
+ chromeos::errors::json::kParseError, error_message);
+ return;
+ }
+ auto command_instance = buffet::CommandInstance::FromJson(
+ value.get(), command_manager_->GetCommandDictionary(), error);
+ if (command_instance)
+ command_manager_->AddCommand(std::move(command_instance));
+}
+
std::string Manager::HandleTestMethod(chromeos::ErrorPtr* error,
const std::string& message) {
LOG(INFO) << "Received call to test method: " << message;
diff --git a/buffet/manager.h b/buffet/manager.h
index 35a5534..be399d5 100644
--- a/buffet/manager.h
+++ b/buffet/manager.h
@@ -58,6 +58,9 @@
// Handles calls to org.chromium.Buffet.Manager.UpdateState().
void HandleUpdateState(chromeos::ErrorPtr* error,
const std::string& json_state_fragment);
+ // Handles calls to org.chromium.Buffet.Manager.AddCommand().
+ void HandleAddCommand(chromeos::ErrorPtr* error,
+ const std::string& json_command);
// Handles calls to org.chromium.Buffet.Manager.Test()
std::string HandleTestMethod(chromeos::ErrorPtr* error,
const std::string& message);