VirtualBox

source: vbox/trunk/src/VBox/Main/webservice/webtest.cpp@ 55747

Last change on this file since 55747 was 53186, checked in by vboxsync, 10 years ago

Main/webservice: better protocol selection

  • Property filesplitter.c set to Makefile.kmk
  • Property svn:eol-style set to native
  • Property svn:keywords set to Id Revision
File size: 23.2 KB
Line 
1/*
2 * webtest.cpp:
3 * demo webservice client in C++. This mimics some of the
4 * functionality of VBoxManage for testing purposes.
5 *
6 * Copyright (C) 2006-2014 Oracle Corporation
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License (GPL) as published by the Free Software
12 * Foundation, in version 2 as it comes in the "COPYING" file of the
13 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15 */
16
17// gSOAP headers (must come after vbox includes because it checks for conflicting defs)
18#include "soapStub.h"
19
20// include generated namespaces table
21#include "vboxwebsrv.nsmap"
22
23#include <iostream>
24#include <sstream>
25#include <string>
26
27
28static void usage(int exitcode)
29{
30 std::cout <<
31 "webtest: VirtualBox webservice testcase.\n"
32 "\nUsage: webtest [options] [command]...\n"
33 "\nSupported options:\n"
34 " -h: print this help message and exit.\n"
35 " -c URL: specify the webservice server URL (default http://localhost:18083/).\n"
36 "\nSupported commands:\n"
37 " - IWebsessionManager:\n"
38 " - webtest logon <user> <pass>: IWebsessionManager::logon().\n"
39 " - webtest getsession <vboxref>: IWebsessionManager::getSessionObject().\n"
40 " - webtest logoff <vboxref>: IWebsessionManager::logoff().\n"
41 " - IVirtualBox:\n"
42 " - webtest version <vboxref>: IVirtualBox::getVersion().\n"
43 " - webtest gethost <vboxref>: IVirtualBox::getHost().\n"
44 " - webtest getpc <vboxref>: IVirtualBox::getPerformanceCollector().\n"
45 " - webtest getmachines <vboxref>: IVirtualBox::getMachines().\n"
46 " - webtest createmachine <vboxref> <settingsPath> <name>: IVirtualBox::createMachine().\n"
47 " - webtest registermachine <vboxref> <machineref>: IVirtualBox::registerMachine().\n"
48 " - IHost:\n"
49 " - webtest getdvddrives <hostref>: IHost::getDVDDrives.\n"
50 " - IHostDVDDrive:\n"
51 " - webtest getdvdname <dvdref>: IHostDVDDrive::getname.\n"
52 " - IMachine:\n"
53 " - webtest getname <machineref>: IMachine::getName().\n"
54 " - webtest getid <machineref>: IMachine::getId().\n"
55 " - webtest getostype <machineref>: IMachine::getGuestOSType().\n"
56 " - webtest savesettings <machineref>: IMachine::saveSettings().\n"
57 " - IPerformanceCollector:\n"
58 " - webtest setupmetrics <pcref>: IPerformanceCollector::setupMetrics()\n"
59 " - webtest querymetricsdata <pcref>: IPerformanceCollector::QueryMetricsData()\n"
60 " - IVirtualBoxErrorInfo:\n"
61 " - webtest errorinfo <eiref>: various IVirtualBoxErrorInfo getters\n"
62 " - All managed object references:\n"
63 " - webtest getif <ref>: report interface of object.\n"
64 " - webtest release <ref>: IUnknown::Release().\n";
65 exit(exitcode);
66}
67
68/**
69 *
70 * @param argc
71 * @param argv[]
72 * @return
73 */
74int main(int argc, char* argv[])
75{
76 bool fSSL = false;
77 const char *pcszArgEndpoint = "http://localhost:18083/";
78
79 int ap;
80 for (ap = 1; ap < argc; ap++)
81 {
82 if (argv[ap][0] == '-')
83 {
84 if (!strcmp(argv[ap], "-h"))
85 usage(0);
86 else if (!strcmp(argv[ap], "-c"))
87 {
88 ap++;
89 if (ap >= argc)
90 usage(1);
91 pcszArgEndpoint = argv[ap];
92 fSSL = !strncmp(pcszArgEndpoint, "https://", 8);
93 }
94 else
95 usage(1);
96 }
97 else
98 break;
99 }
100
101 if (argc < 1 + ap)
102 usage(1);
103
104#ifdef WITH_OPENSSL
105 if (fSSL)
106 soap_ssl_init();
107#endif /* WITH_OPENSSL */
108
109 struct soap soap; // gSOAP runtime environment
110 soap_init(&soap); // initialize runtime environment (only once)
111#ifdef WITH_OPENSSL
112 // Use SOAP_SSL_NO_AUTHENTICATION here to accept broken server configs.
113 // In a real world setup please use at least SOAP_SSL_DEFAULT and provide
114 // the necessary CA certificate for validating the server's certificate.
115 if (fSSL && soap_ssl_client_context(&soap, SOAP_SSL_NO_AUTHENTICATION | SOAP_TLSv1,
116 NULL /*clientkey*/, NULL /*password*/,
117 NULL /*cacert*/, NULL /*capath*/,
118 NULL /*randfile*/))
119 {
120 soap_print_fault(&soap, stderr);
121 exit(1);
122 }
123#endif /* WITH_OPENSSL */
124
125 const char *pcszMode = argv[ap];
126 int soaprc = SOAP_SVR_FAULT;
127
128 if (!strcmp(pcszMode, "logon"))
129 {
130 if (argc < 3 + ap)
131 std::cout << "Not enough arguments for \"" << pcszMode << "\" mode.\n";
132 else
133 {
134 _vbox__IWebsessionManager_USCORElogon req;
135 req.username = argv[ap + 1];
136 req.password = argv[ap + 2];
137 _vbox__IWebsessionManager_USCORElogonResponse resp;
138
139 if (!(soaprc = soap_call___vbox__IWebsessionManager_USCORElogon(&soap,
140 pcszArgEndpoint,
141 NULL,
142 &req,
143 &resp)))
144 std::cout << "VirtualBox objref: \"" << resp.returnval << "\"\n";
145 }
146 }
147 else if (!strcmp(pcszMode, "getsession"))
148 {
149 if (argc < 2 + ap)
150 std::cout << "Not enough arguments for \"" << pcszMode << "\" mode.\n";
151 else
152 {
153 _vbox__IWebsessionManager_USCOREgetSessionObject req;
154 req.refIVirtualBox = argv[ap + 1];
155 _vbox__IWebsessionManager_USCOREgetSessionObjectResponse resp;
156
157 if (!(soaprc = soap_call___vbox__IWebsessionManager_USCOREgetSessionObject(&soap,
158 pcszArgEndpoint,
159 NULL,
160 &req,
161 &resp)))
162 std::cout << "session: \"" << resp.returnval << "\"\n";
163 }
164 }
165 else if (!strcmp(pcszMode, "logoff"))
166 {
167 if (argc < 2 + ap)
168 std::cout << "Not enough arguments for \"" << pcszMode << "\" mode.\n";
169 else
170 {
171 _vbox__IWebsessionManager_USCORElogoff req;
172 req.refIVirtualBox = argv[ap + 1];
173 _vbox__IWebsessionManager_USCORElogoffResponse resp;
174
175 if (!(soaprc = soap_call___vbox__IWebsessionManager_USCORElogoff(&soap,
176 pcszArgEndpoint,
177 NULL,
178 &req,
179 &resp)))
180 {
181 ;
182 }
183 }
184 }
185 else if (!strcmp(pcszMode, "version"))
186 {
187 if (argc < 2 + ap)
188 std::cout << "Not enough arguments for \"" << pcszMode << "\" mode.\n";
189 else
190 {
191 _vbox__IVirtualBox_USCOREgetVersion req;
192 req._USCOREthis = argv[ap + 1];
193 _vbox__IVirtualBox_USCOREgetVersionResponse resp;
194
195 if (!(soaprc = soap_call___vbox__IVirtualBox_USCOREgetVersion(&soap,
196 pcszArgEndpoint,
197 NULL,
198 &req,
199 &resp)))
200 std::cout << "version: \"" << resp.returnval << "\"\n";
201 }
202 }
203 else if (!strcmp(pcszMode, "gethost"))
204 {
205 if (argc < 2 + ap)
206 std::cout << "Not enough arguments for \"" << pcszMode << "\" mode.\n";
207 else
208 {
209 _vbox__IVirtualBox_USCOREgetHost req;
210 req._USCOREthis = argv[ap + 1];
211 _vbox__IVirtualBox_USCOREgetHostResponse resp;
212
213 if (!(soaprc = soap_call___vbox__IVirtualBox_USCOREgetHost(&soap,
214 pcszArgEndpoint,
215 NULL,
216 &req,
217 &resp)))
218 {
219 std::cout << "Host objref " << resp.returnval << "\n";
220 }
221 }
222 }
223 else if (!strcmp(pcszMode, "getpc"))
224 {
225 if (argc < 2 + ap)
226 std::cout << "Not enough arguments for \"" << pcszMode << "\" mode.\n";
227 else
228 {
229 _vbox__IVirtualBox_USCOREgetPerformanceCollector req;
230 req._USCOREthis = argv[ap + 1];
231 _vbox__IVirtualBox_USCOREgetPerformanceCollectorResponse resp;
232
233 if (!(soaprc = soap_call___vbox__IVirtualBox_USCOREgetPerformanceCollector(&soap,
234 pcszArgEndpoint,
235 NULL,
236 &req,
237 &resp)))
238 {
239 std::cout << "Performance collector objref " << resp.returnval << "\n";
240 }
241 }
242 }
243 else if (!strcmp(pcszMode, "getmachines"))
244 {
245 if (argc < 2 + ap)
246 std::cout << "Not enough arguments for \"" << pcszMode << "\" mode.\n";
247 else
248 {
249 _vbox__IVirtualBox_USCOREgetMachines req;
250 req._USCOREthis = argv[ap + 1];
251 _vbox__IVirtualBox_USCOREgetMachinesResponse resp;
252
253 if (!(soaprc = soap_call___vbox__IVirtualBox_USCOREgetMachines(&soap,
254 pcszArgEndpoint,
255 NULL,
256 &req,
257 &resp)))
258 {
259 size_t c = resp.returnval.size();
260 for (size_t i = 0;
261 i < c;
262 ++i)
263 {
264 std::cout << "Machine " << i << ": objref " << resp.returnval[i] << "\n";
265 }
266 }
267 }
268 }
269 else if (!strcmp(pcszMode, "createmachine"))
270 {
271 if (argc < 4 + ap)
272 std::cout << "Not enough arguments for \"" << pcszMode << "\" mode.\n";
273 else
274 {
275 _vbox__IVirtualBox_USCOREcreateMachine req;
276 req._USCOREthis = argv[ap + 1];
277 req.settingsFile = argv[ap + 2];
278 req.name = argv[ap + 3];
279 std::cout << "createmachine: settingsFile = \"" << req.settingsFile << "\", name = \"" << req.name << "\"\n";
280 _vbox__IVirtualBox_USCOREcreateMachineResponse resp;
281
282 if (!(soaprc = soap_call___vbox__IVirtualBox_USCOREcreateMachine(&soap,
283 pcszArgEndpoint,
284 NULL,
285 &req,
286 &resp)))
287 std::cout << "Machine created: managed object reference ID is " << resp.returnval << "\n";
288 }
289 }
290 else if (!strcmp(pcszMode, "registermachine"))
291 {
292 if (argc < 3 + ap)
293 std::cout << "Not enough arguments for \"" << pcszMode << "\" mode.\n";
294 else
295 {
296 _vbox__IVirtualBox_USCOREregisterMachine req;
297 req._USCOREthis = argv[ap + 1];
298 req.machine = argv[ap + 2];
299 _vbox__IVirtualBox_USCOREregisterMachineResponse resp;
300 if (!(soaprc = soap_call___vbox__IVirtualBox_USCOREregisterMachine(&soap,
301 pcszArgEndpoint,
302 NULL,
303 &req,
304 &resp)))
305 std::cout << "Machine registered.\n";
306 }
307 }
308 else if (!strcmp(pcszMode, "getdvddrives"))
309 {
310 if (argc < 2 + ap)
311 std::cout << "Not enough arguments for \"" << pcszMode << "\" mode.\n";
312 else
313 {
314 _vbox__IHost_USCOREgetDVDDrives req;
315 req._USCOREthis = argv[ap + 1];
316 _vbox__IHost_USCOREgetDVDDrivesResponse resp;
317 if (!(soaprc = soap_call___vbox__IHost_USCOREgetDVDDrives(&soap,
318 pcszArgEndpoint,
319 NULL,
320 &req,
321 &resp)))
322 {
323 size_t c = resp.returnval.size();
324 for (size_t i = 0;
325 i < c;
326 ++i)
327 {
328 std::cout << "DVD drive " << i << ": objref " << resp.returnval[i] << "\n";
329 }
330 }
331 }
332 }
333 else if (!strcmp(pcszMode, "getname"))
334 {
335 if (argc < 2 + ap)
336 std::cout << "Not enough arguments for \"" << pcszMode << "\" mode.\n";
337 else
338 {
339 _vbox__IMachine_USCOREgetName req;
340 req._USCOREthis = argv[ap + 1];
341 _vbox__IMachine_USCOREgetNameResponse resp;
342 if (!(soaprc = soap_call___vbox__IMachine_USCOREgetName(&soap,
343 pcszArgEndpoint,
344 NULL,
345 &req,
346 &resp)))
347 printf("Name is: %s\n", resp.returnval.c_str());
348 }
349 }
350 else if (!strcmp(pcszMode, "getid"))
351 {
352 if (argc < 2 + ap)
353 std::cout << "Not enough arguments for \"" << pcszMode << "\" mode.\n";
354 else
355 {
356 _vbox__IMachine_USCOREgetId req;
357 req._USCOREthis = argv[ap + 1];
358 _vbox__IMachine_USCOREgetIdResponse resp;
359 if (!(soaprc = soap_call___vbox__IMachine_USCOREgetId(&soap,
360 pcszArgEndpoint,
361 NULL,
362 &req,
363 &resp)))
364 std::cout << "UUID is: " << resp.returnval << "\n";;
365 }
366 }
367 else if (!strcmp(pcszMode, "getostypeid"))
368 {
369 if (argc < 2 + ap)
370 std::cout << "Not enough arguments for \"" << pcszMode << "\" mode.\n";
371 else
372 {
373 _vbox__IMachine_USCOREgetOSTypeId req;
374 req._USCOREthis = argv[ap + 1];
375 _vbox__IMachine_USCOREgetOSTypeIdResponse resp;
376 if (!(soaprc = soap_call___vbox__IMachine_USCOREgetOSTypeId(&soap,
377 pcszArgEndpoint,
378 NULL,
379 &req,
380 &resp)))
381 std::cout << "Guest OS type is: " << resp.returnval << "\n";
382 }
383 }
384 else if (!strcmp(pcszMode, "savesettings"))
385 {
386 if (argc < 2 + ap)
387 std::cout << "Not enough arguments for \"" << pcszMode << "\" mode.\n";
388 else
389 {
390 _vbox__IMachine_USCOREsaveSettings req;
391 req._USCOREthis = argv[ap + 1];
392 _vbox__IMachine_USCOREsaveSettingsResponse resp;
393 if (!(soaprc = soap_call___vbox__IMachine_USCOREsaveSettings(&soap,
394 pcszArgEndpoint,
395 NULL,
396 &req,
397 &resp)))
398 std::cout << "Settings saved\n";
399 }
400 }
401 else if (!strcmp(pcszMode, "setupmetrics"))
402 {
403 if (argc < 2 + ap)
404 std::cout << "Not enough arguments for \"" << pcszMode << "\" mode.\n";
405 else
406 {
407 _vbox__IPerformanceCollector_USCOREsetupMetrics req;
408 req._USCOREthis = argv[ap + 1];
409// req.metricNames[0] = "*";
410// req.objects
411 req.period = 1; // seconds
412 req.count = 100;
413 _vbox__IPerformanceCollector_USCOREsetupMetricsResponse resp;
414 if (!(soaprc = soap_call___vbox__IPerformanceCollector_USCOREsetupMetrics(&soap,
415 pcszArgEndpoint,
416 NULL,
417 &req,
418 &resp)))
419 {
420 size_t c = resp.returnval.size();
421 for (size_t i = 0;
422 i < c;
423 ++i)
424 {
425 std::cout << "Metric " << i << ": objref " << resp.returnval[i] << "\n";
426 }
427 }
428 }
429 }
430 else if (!strcmp(pcszMode, "querymetricsdata"))
431 {
432 if (argc < 2 + ap)
433 std::cout << "Not enough arguments for \"" << pcszMode << "\" mode.\n";
434 else
435 {
436 _vbox__IPerformanceCollector_USCOREqueryMetricsData req;
437 req._USCOREthis = argv[ap + 1];
438// req.metricNames[0] = "*";
439// req.objects
440 _vbox__IPerformanceCollector_USCOREqueryMetricsDataResponse resp;
441 if (!(soaprc = soap_call___vbox__IPerformanceCollector_USCOREqueryMetricsData(&soap,
442 pcszArgEndpoint,
443 NULL,
444 &req,
445 &resp)))
446 {
447 size_t c = resp.returnval.size();
448 for (size_t i = 0;
449 i < c;
450 ++i)
451 {
452 std::cout << "long " << i << ": " << resp.returnval[i] << "\n";
453 }
454 }
455 }
456 }
457 else if (!strcmp(pcszMode, "errorinfo"))
458 {
459 if (argc < 2 + ap)
460 std::cout << "Not enough arguments for \"" << pcszMode << "\" mode.\n";
461 else
462 {
463 _vbox__IVirtualBoxErrorInfo_USCOREgetResultCode req;
464 req._USCOREthis = argv[ap + 1];
465 _vbox__IVirtualBoxErrorInfo_USCOREgetResultCodeResponse resp;
466 if (!(soaprc = soap_call___vbox__IVirtualBoxErrorInfo_USCOREgetResultCode(&soap,
467 pcszArgEndpoint,
468 NULL,
469 &req,
470 &resp)))
471 {
472 std::cout << "ErrorInfo ResultCode: " << std::hex << resp.returnval << "\n";
473
474 _vbox__IVirtualBoxErrorInfo_USCOREgetText req2;
475 req2._USCOREthis = argv[ap + 1];
476 _vbox__IVirtualBoxErrorInfo_USCOREgetTextResponse resp2;
477 if (!(soaprc = soap_call___vbox__IVirtualBoxErrorInfo_USCOREgetText(&soap,
478 pcszArgEndpoint,
479 NULL,
480 &req2,
481 &resp2)))
482 {
483 std::cout << "ErrorInfo Text: " << resp2.returnval << "\n";
484
485 _vbox__IVirtualBoxErrorInfo_USCOREgetNext req3;
486 req3._USCOREthis = argv[ap + 1];
487 _vbox__IVirtualBoxErrorInfo_USCOREgetNextResponse resp3;
488 if (!(soaprc = soap_call___vbox__IVirtualBoxErrorInfo_USCOREgetNext(&soap,
489 pcszArgEndpoint,
490 NULL,
491 &req3,
492 &resp3)))
493 std::cout << "Next ErrorInfo: " << resp3.returnval << "\n";
494 }
495 }
496 }
497 }
498 else if (!strcmp(pcszMode, "release"))
499 {
500 if (argc < 2 + ap)
501 std::cout << "Not enough arguments for \"" << pcszMode << "\" mode.\n";
502 else
503 {
504 _vbox__IManagedObjectRef_USCORErelease req;
505 req._USCOREthis = argv[ap + 1];
506 _vbox__IManagedObjectRef_USCOREreleaseResponse resp;
507 if (!(soaprc = soap_call___vbox__IManagedObjectRef_USCORErelease(&soap,
508 pcszArgEndpoint,
509 NULL,
510 &req,
511 &resp)))
512 std::cout << "Managed object reference " << req._USCOREthis << " released.\n";
513 }
514 }
515 else
516 std::cout << "Unknown mode parameter \"" << pcszMode << "\".\n";
517
518 if (soaprc)
519 {
520 if ( (soap.fault)
521 && (soap.fault->detail)
522 )
523 {
524 // generic fault message whether the fault is known or not
525 std::cerr << "Generic fault message:\n";
526 soap_print_fault(&soap, stderr); // display the SOAP fault message on the stderr stream
527
528 if (soap.fault->detail->vbox__InvalidObjectFault)
529 {
530 std::cerr << "Bad object ID: " << soap.fault->detail->vbox__InvalidObjectFault->badObjectID << "\n";
531 }
532 else if (soap.fault->detail->vbox__RuntimeFault)
533 {
534 std::cerr << "Result code: 0x" << std::hex << soap.fault->detail->vbox__RuntimeFault->resultCode << "\n";
535 std::cerr << "ErrorInfo: " << soap.fault->detail->vbox__RuntimeFault->returnval << "\n";
536 }
537 }
538 else
539 {
540 std::cerr << "Invalid fault data, fault message:\n";
541 soap_print_fault(&soap, stderr); // display the SOAP fault message on the stderr stream
542 }
543 }
544
545 soap_destroy(&soap); // delete deserialized class instances (for C++ only)
546 soap_end(&soap); // remove deserialized data and clean up
547 soap_done(&soap); // detach the gSOAP environment
548
549 return soaprc;
550}
551
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette