blob: 1b2396b69a11004bba7444f70ab4170627b2a015 [file] [log] [blame]
Chris Sosa45d9f102014-03-24 11:18:54 -07001// Copyright 2014 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Alex Vakulenkoaf23b322014-05-08 16:25:45 -07005#include <iostream> // NOLINT(readability/streams)
Alex Vakulenko7a1dc0b2014-08-15 11:45:46 -07006#include <memory>
Chris Sosa45d9f102014-03-24 11:18:54 -07007#include <string>
Christopher Wiley48e37282014-05-08 14:43:58 -07008#include <sysexits.h>
Chris Sosa45d9f102014-03-24 11:18:54 -07009
Chris Sosaababc5c2014-04-09 15:42:01 -070010#include <base/command_line.h>
Chris Sosa45d9f102014-03-24 11:18:54 -070011#include <base/logging.h>
Christopher Wiley48e37282014-05-08 14:43:58 -070012#include <base/memory/ref_counted.h>
Chris Sosa45d9f102014-03-24 11:18:54 -070013#include <base/memory/scoped_ptr.h>
Alex Vakulenko3cb466c2014-04-15 11:36:32 -070014#include <base/values.h>
Alex Vakulenkoa9044342014-08-23 19:31:27 -070015#include <chromeos/any.h>
Alex Vakulenkoe4879a22014-08-20 15:47:36 -070016#include <chromeos/data_encoding.h>
Alex Vakulenko63cd5fa2014-08-27 08:04:22 -070017#include <chromeos/dbus/data_serialization.h>
Chris Sosa45d9f102014-03-24 11:18:54 -070018#include <dbus/bus.h>
Christopher Wileya4915c42014-03-27 14:45:37 -070019#include <dbus/message.h>
Christopher Wiley48e37282014-05-08 14:43:58 -070020#include <dbus/object_proxy.h>
Christopher Wileyadb901d2014-05-07 09:58:45 -070021#include <dbus/object_manager.h>
Alex Vakulenko3cb466c2014-04-15 11:36:32 -070022#include <dbus/values_util.h>
Chris Sosa45d9f102014-03-24 11:18:54 -070023
Alex Vakulenko89d9d5e2014-09-12 10:27:23 -070024#include "buffet/libbuffet/dbus_constants.h"
Chris Sosa45d9f102014-03-24 11:18:54 -070025
Alex Vakulenko33797062014-05-12 15:55:25 -070026using namespace buffet::dbus_constants; // NOLINT(build/namespaces)
Chris Sosa45d9f102014-03-24 11:18:54 -070027
28namespace {
Alex Vakulenko3cb466c2014-04-15 11:36:32 -070029static const int default_timeout_ms = 1000;
Chris Sosa45d9f102014-03-24 11:18:54 -070030
Christopher Wileya4915c42014-03-27 14:45:37 -070031void usage() {
32 std::cerr << "Possible commands:" << std::endl;
Alex Vakulenko7a1dc0b2014-08-15 11:45:46 -070033 std::cerr << " " << kManagerTestMethod << " <message>" << std::endl;
Alex Vakulenko3cb466c2014-04-15 11:36:32 -070034 std::cerr << " " << kManagerCheckDeviceRegistered << std::endl;
35 std::cerr << " " << kManagerGetDeviceInfo << std::endl;
36 std::cerr << " " << kManagerStartRegisterDevice
37 << " param1 = val1&param2 = val2..." << std::endl;
38 std::cerr << " " << kManagerFinishRegisterDevice
39 << " device_id" << std::endl;
Alex Vakulenko665c8852014-09-11 16:57:24 -070040 std::cerr << " " << kManagerAddCommand
41 << " '{\"name\":\"command_name\",\"parameters\":{}}'"
42 << std::endl;
Christopher Wileya4915c42014-03-27 14:45:37 -070043 std::cerr << " " << kManagerUpdateStateMethod << std::endl;
Christopher Wileyadb901d2014-05-07 09:58:45 -070044 std::cerr << " " << dbus::kObjectManagerGetManagedObjects << std::endl;
Christopher Wileya4915c42014-03-27 14:45:37 -070045}
46
Christopher Wiley48e37282014-05-08 14:43:58 -070047class BuffetHelperProxy {
48 public:
49 int Init() {
50 dbus::Bus::Options options;
51 options.bus_type = dbus::Bus::SYSTEM;
52 bus_ = new dbus::Bus(options);
53 manager_proxy_ = bus_->GetObjectProxy(
54 kServiceName,
55 dbus::ObjectPath(kManagerServicePath));
Christopher Wileyadb901d2014-05-07 09:58:45 -070056 root_proxy_ = bus_->GetObjectProxy(
57 kServiceName,
58 dbus::ObjectPath(kRootServicePath));
Christopher Wiley48e37282014-05-08 14:43:58 -070059 return EX_OK;
Christopher Wileya4915c42014-03-27 14:45:37 -070060 }
61
Christopher Wiley48e37282014-05-08 14:43:58 -070062 int CallTestMethod(const CommandLine::StringVector& args) {
Alex Vakulenko7a1dc0b2014-08-15 11:45:46 -070063 std::string message;
64 if (!args.empty())
65 message = args.front();
66
Christopher Wiley48e37282014-05-08 14:43:58 -070067 dbus::MethodCall method_call(kManagerInterface, kManagerTestMethod);
Alex Vakulenko7a1dc0b2014-08-15 11:45:46 -070068 dbus::MessageWriter writer(&method_call);
69 writer.AppendString(message);
Christopher Wiley48e37282014-05-08 14:43:58 -070070 scoped_ptr<dbus::Response> response(
71 manager_proxy_->CallMethodAndBlock(&method_call, default_timeout_ms));
72 if (!response) {
73 std::cout << "Failed to receive a response." << std::endl;
74 return EX_UNAVAILABLE;
75 }
Alex Vakulenko7a1dc0b2014-08-15 11:45:46 -070076 dbus::MessageReader reader(response.get());
77 std::string response_message;
78 if (!reader.PopString(&response_message)) {
79 std::cout << "No valid response." << std::endl;
80 return EX_SOFTWARE;
81 }
82 std::cout << "Received a response: " << response_message << std::endl;
Christopher Wiley48e37282014-05-08 14:43:58 -070083 return EX_OK;
84 }
85
86 int CallManagerCheckDeviceRegistered(const CommandLine::StringVector& args) {
Alex Vakulenko3cb466c2014-04-15 11:36:32 -070087 if (!args.empty()) {
Christopher Wileya4915c42014-03-27 14:45:37 -070088 std::cerr << "Invalid number of arguments for "
Christopher Wiley48e37282014-05-08 14:43:58 -070089 << "Manager." << kManagerCheckDeviceRegistered << std::endl;
Alex Vakulenko3cb466c2014-04-15 11:36:32 -070090 usage();
91 return EX_USAGE;
92 }
Christopher Wiley48e37282014-05-08 14:43:58 -070093 dbus::MethodCall method_call(
94 kManagerInterface, kManagerCheckDeviceRegistered);
95
96 scoped_ptr<dbus::Response> response(
97 manager_proxy_->CallMethodAndBlock(&method_call, default_timeout_ms));
98 if (!response) {
99 std::cout << "Failed to receive a response." << std::endl;
100 return EX_UNAVAILABLE;
101 }
102
103 dbus::MessageReader reader(response.get());
104 std::string device_id;
105 if (!reader.PopString(&device_id)) {
106 std::cout << "No device ID in response." << std::endl;
107 return EX_SOFTWARE;
108 }
109
110 std::cout << "Device ID: "
111 << (device_id.empty() ? std::string("<unregistered>") : device_id)
112 << std::endl;
113 return EX_OK;
114 }
115
116 int CallManagerGetDeviceInfo(const CommandLine::StringVector& args) {
Alex Vakulenko3cb466c2014-04-15 11:36:32 -0700117 if (!args.empty()) {
118 std::cerr << "Invalid number of arguments for "
Christopher Wiley48e37282014-05-08 14:43:58 -0700119 << "Manager." << kManagerGetDeviceInfo << std::endl;
Alex Vakulenko3cb466c2014-04-15 11:36:32 -0700120 usage();
121 return EX_USAGE;
122 }
Christopher Wiley48e37282014-05-08 14:43:58 -0700123 dbus::MethodCall method_call(
124 kManagerInterface, kManagerGetDeviceInfo);
125
126 scoped_ptr<dbus::Response> response(
127 manager_proxy_->CallMethodAndBlock(&method_call, default_timeout_ms));
128 if (!response) {
129 std::cout << "Failed to receive a response." << std::endl;
130 return EX_UNAVAILABLE;
131 }
132
133 dbus::MessageReader reader(response.get());
134 std::string device_info;
135 if (!reader.PopString(&device_info)) {
136 std::cout << "No device info in response." << std::endl;
137 return EX_SOFTWARE;
138 }
139
140 std::cout << "Device Info: "
141 << (device_info.empty() ? std::string("<unregistered>") : device_info)
142 << std::endl;
143 return EX_OK;
144 }
145
146 int CallManagerStartRegisterDevice(const CommandLine::StringVector& args) {
Alex Vakulenko3cb466c2014-04-15 11:36:32 -0700147 if (args.size() > 1) {
148 std::cerr << "Invalid number of arguments for "
149 << "Manager." << kManagerStartRegisterDevice << std::endl;
Christopher Wileya4915c42014-03-27 14:45:37 -0700150 usage();
Chris Sosaababc5c2014-04-09 15:42:01 -0700151 return EX_USAGE;
Christopher Wileya4915c42014-03-27 14:45:37 -0700152 }
Alex Vakulenko7a1dc0b2014-08-15 11:45:46 -0700153 chromeos::dbus_utils::Dictionary params;
Alex Vakulenko3cb466c2014-04-15 11:36:32 -0700154
155 if (!args.empty()) {
Alex Vakulenkoe4879a22014-08-20 15:47:36 -0700156 auto key_values = chromeos::data_encoding::WebParamsDecode(args.front());
Alex Vakulenkoa0424dd2014-06-13 16:10:17 -0700157 for (const auto& pair : key_values) {
Alex Vakulenkoa9044342014-08-23 19:31:27 -0700158 params.insert(std::make_pair(pair.first, chromeos::Any(pair.second)));
Alex Vakulenko3cb466c2014-04-15 11:36:32 -0700159 }
160 }
161
Christopher Wiley48e37282014-05-08 14:43:58 -0700162 dbus::MethodCall method_call(
163 kManagerInterface, kManagerStartRegisterDevice);
164 dbus::MessageWriter writer(&method_call);
Alex Vakulenkoa9044342014-08-23 19:31:27 -0700165 CHECK(chromeos::dbus_utils::AppendValueToWriter(&writer, params))
166 << "Failed to send the parameters over D-Bus";
Christopher Wiley48e37282014-05-08 14:43:58 -0700167
168 static const int timeout_ms = 3000;
169 scoped_ptr<dbus::Response> response(
170 manager_proxy_->CallMethodAndBlock(&method_call, timeout_ms));
171 if (!response) {
172 std::cout << "Failed to receive a response." << std::endl;
173 return EX_UNAVAILABLE;
174 }
175
176 dbus::MessageReader reader(response.get());
177 std::string info;
178 if (!reader.PopString(&info)) {
179 std::cout << "No valid response." << std::endl;
180 return EX_SOFTWARE;
181 }
182
183 std::cout << "Registration started: " << info << std::endl;
184 return EX_OK;
185 }
186
187 int CallManagerFinishRegisterDevice(const CommandLine::StringVector& args) {
Alex Vakulenko3cb466c2014-04-15 11:36:32 -0700188 if (args.size() > 1) {
189 std::cerr << "Invalid number of arguments for "
190 << "Manager." << kManagerFinishRegisterDevice << std::endl;
191 usage();
192 return EX_USAGE;
193 }
Christopher Wiley48e37282014-05-08 14:43:58 -0700194 dbus::MethodCall method_call(
195 kManagerInterface, kManagerFinishRegisterDevice);
196 dbus::MessageWriter writer(&method_call);
197 std::string user_auth_code;
198 if (!args.empty()) { user_auth_code = args.front(); }
199 writer.AppendString(user_auth_code);
200 static const int timeout_ms = 10000;
201 scoped_ptr<dbus::Response> response(
202 manager_proxy_->CallMethodAndBlock(&method_call, timeout_ms));
203 if (!response) {
204 std::cout << "Failed to receive a response." << std::endl;
205 return EX_UNAVAILABLE;
206 }
207
208 dbus::MessageReader reader(response.get());
209 std::string device_id;
210 if (!reader.PopString(&device_id)) {
211 std::cout << "No device ID in response." << std::endl;
212 return EX_SOFTWARE;
213 }
214
215 std::cout << "Device ID is "
216 << (device_id.empty() ? std::string("<unregistered>") : device_id)
217 << std::endl;
218 return EX_OK;
219 }
220
221 int CallManagerUpdateState(const CommandLine::StringVector& args) {
Chris Sosaababc5c2014-04-09 15:42:01 -0700222 if (args.size() != 1) {
Christopher Wileya4915c42014-03-27 14:45:37 -0700223 std::cerr << "Invalid number of arguments for "
Alex Vakulenko3cb466c2014-04-15 11:36:32 -0700224 << "Manager." << kManagerUpdateStateMethod << std::endl;
Christopher Wileya4915c42014-03-27 14:45:37 -0700225 usage();
Chris Sosaababc5c2014-04-09 15:42:01 -0700226 return EX_USAGE;
Christopher Wileya4915c42014-03-27 14:45:37 -0700227 }
Christopher Wiley48e37282014-05-08 14:43:58 -0700228 dbus::MethodCall method_call(
229 kManagerInterface, kManagerUpdateStateMethod);
230 dbus::MessageWriter writer(&method_call);
231 writer.AppendString(args.front());
232 scoped_ptr<dbus::Response> response(
233 manager_proxy_->CallMethodAndBlock(&method_call, default_timeout_ms));
234 if (!response) {
235 std::cout << "Failed to receive a response." << std::endl;
236 return EX_UNAVAILABLE;
237 }
238 return EX_OK;
239 }
240
Alex Vakulenko665c8852014-09-11 16:57:24 -0700241 int CallManagerAddCommand(const CommandLine::StringVector& args) {
242 if (args.size() != 1) {
243 std::cerr << "Invalid number of arguments for "
244 << "Manager." << kManagerAddCommand << std::endl;
245 usage();
246 return EX_USAGE;
247 }
248 dbus::MethodCall method_call(
249 kManagerInterface, kManagerAddCommand);
250 dbus::MessageWriter writer(&method_call);
251 writer.AppendString(args.front());
252 scoped_ptr<dbus::Response> response(
253 manager_proxy_->CallMethodAndBlock(&method_call, default_timeout_ms));
254 if (!response) {
255 std::cout << "Failed to receive a response." << std::endl;
256 return EX_UNAVAILABLE;
257 }
258 return EX_OK;
259 }
260
Christopher Wileyadb901d2014-05-07 09:58:45 -0700261 int CallRootGetManagedObjects(const CommandLine::StringVector& args) {
262 if (!args.empty()) {
263 std::cerr << "Invalid number of arguments for "
264 << dbus::kObjectManagerGetManagedObjects << std::endl;
265 usage();
266 return EX_USAGE;
267 }
268 dbus::MethodCall method_call(
269 dbus::kObjectManagerInterface, dbus::kObjectManagerGetManagedObjects);
270 scoped_ptr<dbus::Response> response(
271 root_proxy_->CallMethodAndBlock(&method_call, default_timeout_ms));
272 if (!response) {
273 std::cout << "Failed to receive a response." << std::endl;
274 return EX_UNAVAILABLE;
275 }
276 std::cout << response->ToString() << std::endl;
277 return EX_OK;
278 }
279
Christopher Wiley48e37282014-05-08 14:43:58 -0700280 private:
281 scoped_refptr<dbus::Bus> bus_;
Alex Vakulenkoa0424dd2014-06-13 16:10:17 -0700282 dbus::ObjectProxy* manager_proxy_{nullptr};
283 dbus::ObjectProxy* root_proxy_{nullptr};
Christopher Wiley48e37282014-05-08 14:43:58 -0700284};
285
Alex Vakulenko33797062014-05-12 15:55:25 -0700286} // namespace
Christopher Wiley48e37282014-05-08 14:43:58 -0700287
288int main(int argc, char** argv) {
289 CommandLine::Init(argc, argv);
290 CommandLine* cl = CommandLine::ForCurrentProcess();
291 CommandLine::StringVector args = cl->GetArgs();
292 if (args.empty()) {
Christopher Wileya4915c42014-03-27 14:45:37 -0700293 usage();
Chris Sosaababc5c2014-04-09 15:42:01 -0700294 return EX_USAGE;
Christopher Wileya4915c42014-03-27 14:45:37 -0700295 }
296
Christopher Wiley48e37282014-05-08 14:43:58 -0700297 // Pop the command off of the args list.
298 std::string command = args.front();
299 args.erase(args.begin());
300 int err = EX_USAGE;
301 BuffetHelperProxy helper;
302 err = helper.Init();
303 if (err) {
304 std::cerr << "Error initializing proxies." << std::endl;
305 return err;
Christopher Wileya4915c42014-03-27 14:45:37 -0700306 }
307
Christopher Wiley48e37282014-05-08 14:43:58 -0700308 if (command.compare(kManagerTestMethod) == 0) {
309 err = helper.CallTestMethod(args);
310 } else if (command.compare(kManagerCheckDeviceRegistered) == 0 ||
311 command.compare("cr") == 0) {
312 err = helper.CallManagerCheckDeviceRegistered(args);
313 } else if (command.compare(kManagerGetDeviceInfo) == 0 ||
314 command.compare("di") == 0) {
315 err = helper.CallManagerGetDeviceInfo(args);
316 } else if (command.compare(kManagerStartRegisterDevice) == 0 ||
317 command.compare("sr") == 0) {
318 err = helper.CallManagerStartRegisterDevice(args);
319 } else if (command.compare(kManagerFinishRegisterDevice) == 0 ||
320 command.compare("fr") == 0) {
321 err = helper.CallManagerFinishRegisterDevice(args);
322 } else if (command.compare(kManagerUpdateStateMethod) == 0 ||
323 command.compare("us") == 0) {
324 err = helper.CallManagerUpdateState(args);
Alex Vakulenko665c8852014-09-11 16:57:24 -0700325 } else if (command.compare(kManagerAddCommand) == 0 ||
326 command.compare("ac") == 0) {
327 err = helper.CallManagerAddCommand(args);
Christopher Wileyadb901d2014-05-07 09:58:45 -0700328 } else if (command.compare(dbus::kObjectManagerGetManagedObjects) == 0) {
329 err = helper.CallRootGetManagedObjects(args);
Christopher Wiley48e37282014-05-08 14:43:58 -0700330 } else {
331 std::cerr << "Unknown command: " << command << std::endl;
332 usage();
333 }
Chris Sosa45d9f102014-03-24 11:18:54 -0700334
Christopher Wiley48e37282014-05-08 14:43:58 -0700335 if (err) {
336 std::cerr << "Done, with errors." << std::endl;
337 } else {
338 std::cout << "Done." << std::endl;
339 }
340 return err;
341}