blob: 11f4ffc63c030bd1e8637d84e6ea7b38c5e332fa [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)
Chris Sosa45d9f102014-03-24 11:18:54 -07006#include <string>
Christopher Wiley48e37282014-05-08 14:43:58 -07007#include <sysexits.h>
Chris Sosa45d9f102014-03-24 11:18:54 -07008
Chris Sosaababc5c2014-04-09 15:42:01 -07009#include <base/command_line.h>
Chris Sosa45d9f102014-03-24 11:18:54 -070010#include <base/logging.h>
Christopher Wiley48e37282014-05-08 14:43:58 -070011#include <base/memory/ref_counted.h>
Chris Sosa45d9f102014-03-24 11:18:54 -070012#include <base/memory/scoped_ptr.h>
Alex Vakulenko3cb466c2014-04-15 11:36:32 -070013#include <base/values.h>
Chris Sosa45d9f102014-03-24 11:18:54 -070014#include <dbus/bus.h>
Christopher Wileya4915c42014-03-27 14:45:37 -070015#include <dbus/message.h>
Christopher Wiley48e37282014-05-08 14:43:58 -070016#include <dbus/object_proxy.h>
Christopher Wileyadb901d2014-05-07 09:58:45 -070017#include <dbus/object_manager.h>
Alex Vakulenko3cb466c2014-04-15 11:36:32 -070018#include <dbus/values_util.h>
Chris Sosa45d9f102014-03-24 11:18:54 -070019
Christopher Wileyeb19fa02014-03-27 13:27:30 -070020#include "buffet/dbus_constants.h"
Alex Vakulenko3cb466c2014-04-15 11:36:32 -070021#include "buffet/data_encoding.h"
Chris Sosa45d9f102014-03-24 11:18:54 -070022
Alex Vakulenko33797062014-05-12 15:55:25 -070023using namespace buffet::dbus_constants; // NOLINT(build/namespaces)
Chris Sosa45d9f102014-03-24 11:18:54 -070024
25namespace {
Alex Vakulenko3cb466c2014-04-15 11:36:32 -070026static const int default_timeout_ms = 1000;
Chris Sosa45d9f102014-03-24 11:18:54 -070027
Christopher Wileya4915c42014-03-27 14:45:37 -070028void usage() {
29 std::cerr << "Possible commands:" << std::endl;
Christopher Wileyb76eb292014-05-05 16:09:16 -070030 std::cerr << " " << kManagerTestMethod << std::endl;
Alex Vakulenko3cb466c2014-04-15 11:36:32 -070031 std::cerr << " " << kManagerCheckDeviceRegistered << std::endl;
32 std::cerr << " " << kManagerGetDeviceInfo << std::endl;
33 std::cerr << " " << kManagerStartRegisterDevice
34 << " param1 = val1&param2 = val2..." << std::endl;
35 std::cerr << " " << kManagerFinishRegisterDevice
36 << " device_id" << std::endl;
Christopher Wileya4915c42014-03-27 14:45:37 -070037 std::cerr << " " << kManagerUpdateStateMethod << std::endl;
Christopher Wileyadb901d2014-05-07 09:58:45 -070038 std::cerr << " " << dbus::kObjectManagerGetManagedObjects << std::endl;
Christopher Wileya4915c42014-03-27 14:45:37 -070039}
40
Christopher Wiley48e37282014-05-08 14:43:58 -070041class BuffetHelperProxy {
42 public:
43 int Init() {
44 dbus::Bus::Options options;
45 options.bus_type = dbus::Bus::SYSTEM;
46 bus_ = new dbus::Bus(options);
47 manager_proxy_ = bus_->GetObjectProxy(
48 kServiceName,
49 dbus::ObjectPath(kManagerServicePath));
Christopher Wileyadb901d2014-05-07 09:58:45 -070050 root_proxy_ = bus_->GetObjectProxy(
51 kServiceName,
52 dbus::ObjectPath(kRootServicePath));
Christopher Wiley48e37282014-05-08 14:43:58 -070053 return EX_OK;
Christopher Wileya4915c42014-03-27 14:45:37 -070054 }
55
Christopher Wiley48e37282014-05-08 14:43:58 -070056 int CallTestMethod(const CommandLine::StringVector& args) {
57 dbus::MethodCall method_call(kManagerInterface, kManagerTestMethod);
58 scoped_ptr<dbus::Response> response(
59 manager_proxy_->CallMethodAndBlock(&method_call, default_timeout_ms));
60 if (!response) {
61 std::cout << "Failed to receive a response." << std::endl;
62 return EX_UNAVAILABLE;
63 }
64 std::cout << "Received a response." << std::endl;
65 return EX_OK;
66 }
67
68 int CallManagerCheckDeviceRegistered(const CommandLine::StringVector& args) {
Alex Vakulenko3cb466c2014-04-15 11:36:32 -070069 if (!args.empty()) {
Christopher Wileya4915c42014-03-27 14:45:37 -070070 std::cerr << "Invalid number of arguments for "
Christopher Wiley48e37282014-05-08 14:43:58 -070071 << "Manager." << kManagerCheckDeviceRegistered << std::endl;
Alex Vakulenko3cb466c2014-04-15 11:36:32 -070072 usage();
73 return EX_USAGE;
74 }
Christopher Wiley48e37282014-05-08 14:43:58 -070075 dbus::MethodCall method_call(
76 kManagerInterface, kManagerCheckDeviceRegistered);
77
78 scoped_ptr<dbus::Response> response(
79 manager_proxy_->CallMethodAndBlock(&method_call, default_timeout_ms));
80 if (!response) {
81 std::cout << "Failed to receive a response." << std::endl;
82 return EX_UNAVAILABLE;
83 }
84
85 dbus::MessageReader reader(response.get());
86 std::string device_id;
87 if (!reader.PopString(&device_id)) {
88 std::cout << "No device ID in response." << std::endl;
89 return EX_SOFTWARE;
90 }
91
92 std::cout << "Device ID: "
93 << (device_id.empty() ? std::string("<unregistered>") : device_id)
94 << std::endl;
95 return EX_OK;
96 }
97
98 int CallManagerGetDeviceInfo(const CommandLine::StringVector& args) {
Alex Vakulenko3cb466c2014-04-15 11:36:32 -070099 if (!args.empty()) {
100 std::cerr << "Invalid number of arguments for "
Christopher Wiley48e37282014-05-08 14:43:58 -0700101 << "Manager." << kManagerGetDeviceInfo << std::endl;
Alex Vakulenko3cb466c2014-04-15 11:36:32 -0700102 usage();
103 return EX_USAGE;
104 }
Christopher Wiley48e37282014-05-08 14:43:58 -0700105 dbus::MethodCall method_call(
106 kManagerInterface, kManagerGetDeviceInfo);
107
108 scoped_ptr<dbus::Response> response(
109 manager_proxy_->CallMethodAndBlock(&method_call, default_timeout_ms));
110 if (!response) {
111 std::cout << "Failed to receive a response." << std::endl;
112 return EX_UNAVAILABLE;
113 }
114
115 dbus::MessageReader reader(response.get());
116 std::string device_info;
117 if (!reader.PopString(&device_info)) {
118 std::cout << "No device info in response." << std::endl;
119 return EX_SOFTWARE;
120 }
121
122 std::cout << "Device Info: "
123 << (device_info.empty() ? std::string("<unregistered>") : device_info)
124 << std::endl;
125 return EX_OK;
126 }
127
128 int CallManagerStartRegisterDevice(const CommandLine::StringVector& args) {
Alex Vakulenko3cb466c2014-04-15 11:36:32 -0700129 if (args.size() > 1) {
130 std::cerr << "Invalid number of arguments for "
131 << "Manager." << kManagerStartRegisterDevice << std::endl;
Christopher Wileya4915c42014-03-27 14:45:37 -0700132 usage();
Chris Sosaababc5c2014-04-09 15:42:01 -0700133 return EX_USAGE;
Christopher Wileya4915c42014-03-27 14:45:37 -0700134 }
Alex Vakulenko3cb466c2014-04-15 11:36:32 -0700135 std::map<std::string, std::shared_ptr<base::Value>> params;
136
137 if (!args.empty()) {
Alex Vakulenkoaf23b322014-05-08 16:25:45 -0700138 auto key_values = buffet::data_encoding::WebParamsDecode(args.front());
Alex Vakulenkoa0424dd2014-06-13 16:10:17 -0700139 for (const auto& pair : key_values) {
Alex Vakulenko3cb466c2014-04-15 11:36:32 -0700140 params.insert(std::make_pair(
141 pair.first, std::shared_ptr<base::Value>(
142 base::Value::CreateStringValue(pair.second))));
143 }
144 }
145
Christopher Wiley48e37282014-05-08 14:43:58 -0700146 dbus::MethodCall method_call(
147 kManagerInterface, kManagerStartRegisterDevice);
148 dbus::MessageWriter writer(&method_call);
149 dbus::MessageWriter dict_writer(nullptr);
150 writer.OpenArray("{sv}", &dict_writer);
Alex Vakulenkoa0424dd2014-06-13 16:10:17 -0700151 for (const auto& pair : params) {
Christopher Wiley48e37282014-05-08 14:43:58 -0700152 dbus::MessageWriter dict_entry_writer(nullptr);
153 dict_writer.OpenDictEntry(&dict_entry_writer);
154 dict_entry_writer.AppendString(pair.first);
155 dbus::AppendBasicTypeValueDataAsVariant(&dict_entry_writer,
156 *pair.second.get());
157 dict_writer.CloseContainer(&dict_entry_writer);
158 }
159 writer.CloseContainer(&dict_writer);
160
161 static const int timeout_ms = 3000;
162 scoped_ptr<dbus::Response> response(
163 manager_proxy_->CallMethodAndBlock(&method_call, timeout_ms));
164 if (!response) {
165 std::cout << "Failed to receive a response." << std::endl;
166 return EX_UNAVAILABLE;
167 }
168
169 dbus::MessageReader reader(response.get());
170 std::string info;
171 if (!reader.PopString(&info)) {
172 std::cout << "No valid response." << std::endl;
173 return EX_SOFTWARE;
174 }
175
176 std::cout << "Registration started: " << info << std::endl;
177 return EX_OK;
178 }
179
180 int CallManagerFinishRegisterDevice(const CommandLine::StringVector& args) {
Alex Vakulenko3cb466c2014-04-15 11:36:32 -0700181 if (args.size() > 1) {
182 std::cerr << "Invalid number of arguments for "
183 << "Manager." << kManagerFinishRegisterDevice << std::endl;
184 usage();
185 return EX_USAGE;
186 }
Christopher Wiley48e37282014-05-08 14:43:58 -0700187 dbus::MethodCall method_call(
188 kManagerInterface, kManagerFinishRegisterDevice);
189 dbus::MessageWriter writer(&method_call);
190 std::string user_auth_code;
191 if (!args.empty()) { user_auth_code = args.front(); }
192 writer.AppendString(user_auth_code);
193 static const int timeout_ms = 10000;
194 scoped_ptr<dbus::Response> response(
195 manager_proxy_->CallMethodAndBlock(&method_call, timeout_ms));
196 if (!response) {
197 std::cout << "Failed to receive a response." << std::endl;
198 return EX_UNAVAILABLE;
199 }
200
201 dbus::MessageReader reader(response.get());
202 std::string device_id;
203 if (!reader.PopString(&device_id)) {
204 std::cout << "No device ID in response." << std::endl;
205 return EX_SOFTWARE;
206 }
207
208 std::cout << "Device ID is "
209 << (device_id.empty() ? std::string("<unregistered>") : device_id)
210 << std::endl;
211 return EX_OK;
212 }
213
214 int CallManagerUpdateState(const CommandLine::StringVector& args) {
Chris Sosaababc5c2014-04-09 15:42:01 -0700215 if (args.size() != 1) {
Christopher Wileya4915c42014-03-27 14:45:37 -0700216 std::cerr << "Invalid number of arguments for "
Alex Vakulenko3cb466c2014-04-15 11:36:32 -0700217 << "Manager." << kManagerUpdateStateMethod << std::endl;
Christopher Wileya4915c42014-03-27 14:45:37 -0700218 usage();
Chris Sosaababc5c2014-04-09 15:42:01 -0700219 return EX_USAGE;
Christopher Wileya4915c42014-03-27 14:45:37 -0700220 }
Christopher Wiley48e37282014-05-08 14:43:58 -0700221 dbus::MethodCall method_call(
222 kManagerInterface, kManagerUpdateStateMethod);
223 dbus::MessageWriter writer(&method_call);
224 writer.AppendString(args.front());
225 scoped_ptr<dbus::Response> response(
226 manager_proxy_->CallMethodAndBlock(&method_call, default_timeout_ms));
227 if (!response) {
228 std::cout << "Failed to receive a response." << std::endl;
229 return EX_UNAVAILABLE;
230 }
231 return EX_OK;
232 }
233
Christopher Wileyadb901d2014-05-07 09:58:45 -0700234 int CallRootGetManagedObjects(const CommandLine::StringVector& args) {
235 if (!args.empty()) {
236 std::cerr << "Invalid number of arguments for "
237 << dbus::kObjectManagerGetManagedObjects << std::endl;
238 usage();
239 return EX_USAGE;
240 }
241 dbus::MethodCall method_call(
242 dbus::kObjectManagerInterface, dbus::kObjectManagerGetManagedObjects);
243 scoped_ptr<dbus::Response> response(
244 root_proxy_->CallMethodAndBlock(&method_call, default_timeout_ms));
245 if (!response) {
246 std::cout << "Failed to receive a response." << std::endl;
247 return EX_UNAVAILABLE;
248 }
249 std::cout << response->ToString() << std::endl;
250 return EX_OK;
251 }
252
Christopher Wiley48e37282014-05-08 14:43:58 -0700253 private:
254 scoped_refptr<dbus::Bus> bus_;
Alex Vakulenkoa0424dd2014-06-13 16:10:17 -0700255 dbus::ObjectProxy* manager_proxy_{nullptr};
256 dbus::ObjectProxy* root_proxy_{nullptr};
Christopher Wiley48e37282014-05-08 14:43:58 -0700257};
258
Alex Vakulenko33797062014-05-12 15:55:25 -0700259} // namespace
Christopher Wiley48e37282014-05-08 14:43:58 -0700260
261int main(int argc, char** argv) {
262 CommandLine::Init(argc, argv);
263 CommandLine* cl = CommandLine::ForCurrentProcess();
264 CommandLine::StringVector args = cl->GetArgs();
265 if (args.empty()) {
Christopher Wileya4915c42014-03-27 14:45:37 -0700266 usage();
Chris Sosaababc5c2014-04-09 15:42:01 -0700267 return EX_USAGE;
Christopher Wileya4915c42014-03-27 14:45:37 -0700268 }
269
Christopher Wiley48e37282014-05-08 14:43:58 -0700270 // Pop the command off of the args list.
271 std::string command = args.front();
272 args.erase(args.begin());
273 int err = EX_USAGE;
274 BuffetHelperProxy helper;
275 err = helper.Init();
276 if (err) {
277 std::cerr << "Error initializing proxies." << std::endl;
278 return err;
Christopher Wileya4915c42014-03-27 14:45:37 -0700279 }
280
Christopher Wiley48e37282014-05-08 14:43:58 -0700281 if (command.compare(kManagerTestMethod) == 0) {
282 err = helper.CallTestMethod(args);
283 } else if (command.compare(kManagerCheckDeviceRegistered) == 0 ||
284 command.compare("cr") == 0) {
285 err = helper.CallManagerCheckDeviceRegistered(args);
286 } else if (command.compare(kManagerGetDeviceInfo) == 0 ||
287 command.compare("di") == 0) {
288 err = helper.CallManagerGetDeviceInfo(args);
289 } else if (command.compare(kManagerStartRegisterDevice) == 0 ||
290 command.compare("sr") == 0) {
291 err = helper.CallManagerStartRegisterDevice(args);
292 } else if (command.compare(kManagerFinishRegisterDevice) == 0 ||
293 command.compare("fr") == 0) {
294 err = helper.CallManagerFinishRegisterDevice(args);
295 } else if (command.compare(kManagerUpdateStateMethod) == 0 ||
296 command.compare("us") == 0) {
297 err = helper.CallManagerUpdateState(args);
Christopher Wileyadb901d2014-05-07 09:58:45 -0700298 } else if (command.compare(dbus::kObjectManagerGetManagedObjects) == 0) {
299 err = helper.CallRootGetManagedObjects(args);
Christopher Wiley48e37282014-05-08 14:43:58 -0700300 } else {
301 std::cerr << "Unknown command: " << command << std::endl;
302 usage();
303 }
Chris Sosa45d9f102014-03-24 11:18:54 -0700304
Christopher Wiley48e37282014-05-08 14:43:58 -0700305 if (err) {
306 std::cerr << "Done, with errors." << std::endl;
307 } else {
308 std::cout << "Done." << std::endl;
309 }
310 return err;
311}