66 armarXManager->getIceManager()->getIceGridSession()->getAdmin(),
72 if (app.get() !=
nullptr)
74 startApplication(options.
command,
77 armarXManager->getIceManager()->getIceGridSession()->getAdmin(),
85 "' in scenario '" + localScen->getName() +
"'");
92 std::cout <<
"Finished" << std::endl;
97 armarXManager->shutdown();
100 armarXManager->waitForShutdown();
105 ScenarioCli::run(
int argc,
char* argv[])
108 using namespace Parser;
109 using namespace Data_Structure;
113 communicator()->getProperties()->clone(), argc, argv)));
117 std::cout <<
"Failed to parse arguments. exiting";
120 ScenarioManagerCliOptions cliOptionsManager;
121 options = cliOptionsManager.parseCmdOptions(argc, argv);
124 if (!options.parameters.empty())
126 std::cout <<
"Additional command line parameters are: " << options.parameters
131 if (options.showHelp || options.error)
135 cliOptionsManager.showHelp(options,
"Could not parse input parameters");
138 cliOptionsManager.showHelp(options);
143 if (options.print && options.command !=
"start")
145 cliOptionsManager.showHelp(options,
146 "Print is only a valid option for the start command");
149 else if (options.wait && (options.command ==
"list" || options.command ==
"status"))
151 cliOptionsManager.showHelp(options,
"Wait is not valid for the list or status command");
155 PackageBuilder builder;
158 if (options.command.compare(
"list") == 0)
160 std::cout <<
"Listing all Scenarios out of default Packages" << std::endl;
163 std::cout <<
"Scenarios in " <<
package << ":" << std::endl;
164 PackagePtr currentPackage = builder.parsePackage(package);
165 if (currentPackage.get() ==
nullptr)
167 std::cout <<
"Package " <<
package
168 << " is listed in default packages, but could not be found"
174 for (
auto scenario : *(currentPackage->getScenarios()))
176 std::cout << scenario->getName() << std::endl;
178 std::cout << std::endl << std::endl;
183 std::string packageName = options.packageName;
184 std::string scenarioName =
187 if (options.packageName.empty())
189 if (std::filesystem::is_regular_file(std::filesystem::path(options.scxPath)) ||
190 std::filesystem::is_directory(std::filesystem::path(options.scxPath)))
193 std::string filePackageName;
194 if (std::filesystem::is_regular_file(std::filesystem::path(options.scxPath)))
196 filePackageName =
parser.getPackageNameFromScx(options.scxPath);
201 parser.getPackageNameFromScx((std::filesystem::path(options.scxPath) /
202 std::filesystem::path(scenarioName +
".scx"))
206 if (filePackageName !=
"")
208 packageName = filePackageName;
212 packageName = packageChoosingDialog(scenarioName);
213 if (packageName.empty())
215 options.error =
true;
216 cliOptionsManager.showHelp(options,
217 "Could not find any package for " +
219 ". Please add a PackageName or Add the "
220 "PackageName to your default config.");
227 packageName = packageChoosingDialog(scenarioName);
228 if (packageName.empty())
230 options.error =
true;
231 cliOptionsManager.showHelp(options,
232 "Could not find any package for " + options.scxPath +
233 ". Please add a PackageName or Add the "
234 "PackageName to your default config.");
241 if (scenarioName.empty())
243 options.error =
true;
244 cliOptionsManager.showHelp(options,
245 "Could not find Scenario " + options.scxPath +
246 " in Package " + packageName);
253 CMakePackageFinder finder(packageName);
254 if (!finder.packageFound())
256 options.error =
true;
257 cliOptionsManager.showHelp(
258 options,
"CMakePackageFinder could not find package '" + packageName +
"'");
263 std::vector<std::string> scenarios =
264 parser.getScenariosFromFolder(finder.getScenariosDir());
266 for (
auto scen : scenarios)
268 auto sFolderPos = scen.rfind(
"/");
269 if ((sFolderPos == std::string::npos && scen == scenarioName) ||
270 (sFolderPos != std::string::npos && scen.substr(sFolderPos + 1) == scenarioName))
272 package = builder.parsePackage(packageName,
273 StringList{scen + "::Package::" + packageName});
278 if (package.get() ==
nullptr)
280 cliOptionsManager.showHelp(options,
"Failed to parse package " + packageName);
284 scenario = package->getScenarioByName(scenarioName);
286 if (scenario.get() ==
nullptr)
288 options.
error =
true;
289 cliOptionsManager.showHelp(options,
290 "Could not find Scenario " + scenarioName +
" in Package " +
295 if (options.command ==
"generate")
304 localScen = scenario;
306 const char* n_argv[] = {argv[0],
"--ArmarX.RedirectStdout=false"};
311 ScenarioCli::packageChoosingDialog(std::string scenarioName)
314 using namespace Parser;
315 using namespace Data_Structure;
316 using namespace Exec;
317 StringList packages = PackageBuilder::FilterPackagesForScenario(scenarioName);
319 if (packages.size() == 0)
323 else if (packages.size() == 1)
327 else if (packages.size() > 1)
330 while (answer > packages.size())
333 <<
"Found multiple possible packages for this Scenario path, please select: "
336 for (
auto package : packages)
338 std::cout << number <<
") " <<
package << std::endl;
341 std::cout <<
"Please enter a number now: " << std::endl;
343 std::string answerString;
344 std::cin >> answerString;
347 answer = boost::lexical_cast<size_t>(answerString);
351 std::cout <<
"ERROR: Could not convert input to a number - please type in a "
352 "number between 1 and "
353 << packages.size() << std::endl
358 if (answer > packages.size() || answer == 0)
365 return packages[answer];
372 ScenarioCli::startScenario(std::string command,
375 IceGrid::AdminPrx iceAdmin,
376 const std::string& commandLineParameters)
379 using namespace Exec;
380 StopStrategyFactory stopStrategyFactory;
382 stopStrategyFactory.getStopStrategy(StopperFactory::getFactory()->getPidStopper()),
383 StarterFactory::getFactory()->getStarter());
385 std::future<void> result;
390 for (
auto app : *scenario->getApplications())
392 app->setStatus(executor.getApplicationStatus(app));
396 if (command ==
"status")
398 std::cout <<
"Status of " << scenario->getName() <<
" is: ";
400 if (scenario->getStatus() ==
405 else if (scenario->getStatus() ==
410 else if (scenario->getStatus() ==
415 else if (scenario->getStatus() ==
425 std::cout << std::endl;
427 for (
auto app : *scenario->getApplications())
429 std::cout <<
"\t " << app->getName() <<
" : ";
434 else if (app->getStatus() ==
439 else if (app->getStatus() ==
449 std::cout << std::endl;
453 else if (command ==
"periodic_status")
457 std::cout <<
"Status of " << scenario->getName() <<
" is: ";
459 if (scenario->getStatus() ==
"Running")
461 coloredStdOut(
"Running", 92);
463 else if (scenario->getStatus() ==
"Stopped")
465 coloredStdOut(
"Stopped", 31);
467 else if (scenario->getStatus() ==
"Mixed")
469 coloredStdOut(
"Mixed", 93);
471 std::cout << std::endl;
472 for (
auto app : *scenario->getApplications())
474 app->setStatus(executor.getApplicationStatus(app));
479 else if (command ==
"start")
483 std::cout <<
"Starting Scenario ";
485 result = executor.startScenario(scenario, printOnly, commandLineParameters);
487 else if (command ==
"stop")
489 std::cout <<
"Stopping Scenario ";
490 result = executor.stopScenario(scenario);
492 else if (command ==
"kill")
494 std::cout <<
"Killing Scenario ";
495 executor.setStopStrategy(stopStrategyFactory.getStopAndKillStrategy(
496 StopperFactory::getFactory()->getPidStopper(), 500),
499 result = executor.stopScenario(scenario);
501 else if (command ==
"restart")
504 executor.setStopStrategy(stopStrategyFactory.getStopAndKillStrategy(
505 StopperFactory::getFactory()->getPidStopper(), 500),
508 result = executor.restartScenario(scenario, printOnly);
513 std::cout << scenario->getName() << std::endl;
520 ScenarioCli::startApplication(std::string command,
523 IceGrid::AdminPrx iceAdmin,
524 const std::string& commandLineParameters)
527 using namespace Exec;
528 StopStrategyFactory stopStrategyFactory;
530 stopStrategyFactory.getStopStrategy(StopperFactory::getFactory()->getPidStopper()),
531 StarterFactory::getFactory()->getStarter());
533 std::future<void> result;
538 app->setStatus(executor.getApplicationStatus(app));
540 if (command ==
"status")
542 std::cout <<
"Status of " << app->getName() <<
"is: ";
547 else if (app->getStatus() ==
552 else if (app->getStatus() ==
561 std::cout << std::endl;
564 else if (command ==
"start")
568 std::cout <<
"Starting Application ";
571 result = executor.startApplication(app, printOnly, commandLineParameters);
573 else if (command ==
"stop")
575 std::cout <<
"Stopping Application ";
576 result = executor.stopApplication(app);
578 else if (command ==
"kill")
580 std::cout <<
"Killing Application ";
581 executor.setStopStrategy(stopStrategyFactory.getStopAndKillStrategy(
582 StopperFactory::getFactory()->getByNameStopper(), 0),
584 result = executor.stopApplication(app);
586 else if (command ==
"restart")
588 std::cout <<
"Restarting Application ";
589 executor.setStopStrategy(stopStrategyFactory.getStopAndKillStrategy(
590 StopperFactory::getFactory()->getByNameStopper(), 0),
592 result = executor.restartApplication(app, printOnly);
597 std::cout << app->getName() << std::endl;
603 ScenarioCli::coloredStdOut(std::string
message,
int colorCode)
605 std::cout <<
"\033[" << colorCode <<
"m" <<
message <<
"\033[0m";