VirtualBox

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

Last change on this file since 67414 was 62485, checked in by vboxsync, 8 years ago

(C) 2016

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