61 if (options.applicationName.empty())
63 startScenario(options.command,
66 armarXManager->getIceManager()->getIceGridSession()->getAdmin(),
72 if (app.get() !=
nullptr)
74 startApplication(options.command,
77 armarXManager->getIceManager()->getIceGridSession()->getAdmin(),
83 optionsManager.showHelp(options,
84 "Could not find application '" + options.applicationName +
85 "' in scenario '" + localScen->getName() +
"'");
92 std::cout <<
"Finished" << std::endl;
95 if (!options.wait || options.print)
97 armarXManager->shutdown();
100 armarXManager->waitForShutdown();
105 ScenarioCli::run(
int argc,
char* argv[])
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")
297 Generator::IceGridXmlGenerator generator;
304 localScen = scenario;
306 const char* n_argv[] = {argv[0],
"--ArmarX.RedirectStdout=false"};
311 ScenarioCli::packageChoosingDialog(std::string scenarioName)
313 using namespace ScenarioManager;
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)
378 using namespace ScenarioManager;
379 using namespace Exec;
380 StopStrategyFactory stopStrategyFactory;
382 stopStrategyFactory.getStopStrategy(StopperFactory::getFactory()->getPidStopper()),
383 StarterFactory::getFactory()->getStarter());
385 std::future<void> result;
387 StatusManager manager;
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)
526 using namespace ScenarioManager;
527 using namespace Exec;
528 StopStrategyFactory stopStrategyFactory;
530 stopStrategyFactory.getStopStrategy(StopperFactory::getFactory()->getPidStopper()),
531 StarterFactory::getFactory()->getStarter());
533 std::future<void> result;
535 StatusManager manager;
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";
std::shared_ptr< ScenarioManager::Data_Structure::ApplicationInstance > ApplicationInstancePtr
void generateLocalApplication(Data_Structure::ScenarioPtr scenario)
void generateRemoteApplication(Data_Structure::ScenarioPtr scenario)
int run(int argc, char *argv[]) override
Ice::Application replacement for the main function.
std::vector< std::string > getArmarXPackageNames()
getDefaultPackageNames returns the value of the ArmarX.DefaultPackages property It splits the string ...
void setIceProperties(Ice::PropertiesPtr properties) override
Overrides PropertyUser::setIceProperties() which is called internally.
static Ice::PropertiesPtr create(const Ice::PropertiesPtr &iceProperties=nullptr)
void setup(const ManagedIceObjectRegistryInterfacePtr ®istry, Ice::PropertiesPtr properties) override
Setup method to be implemented by user applications.
int exec(const ArmarXManagerPtr &armarXManager) override
Exec method is the main process of the application.
static std::string GetScenarioNameByCommandLineInput(CmdOptions string)
static void SleepMS(float milliseconds)
#define ARMARX_INFO
The normal logging level.
::IceInternal::Handle<::Ice::Properties > PropertiesPtr
std::shared_ptr< Scenario > ScenarioPtr
std::shared_ptr< Package > PackagePtr
std::shared_ptr< ApplicationInstance > ApplicationInstancePtr
std::vector< std::string > StringList
Ice::PropertiesPtr mergeProperties(Ice::PropertiesPtr properties, int argc, char *argv[])
Merge command line options into properties.
This file offers overloads of toIce() and fromIce() functions for STL container types.
IceUtil::Handle< ArmarXManager > ArmarXManagerPtr
IceUtil::Handle< ManagedIceObjectRegistryInterface > ManagedIceObjectRegistryInterfacePtr
static const std::string Stopped
static const std::string Mixed
static const std::string Unknown
static const std::string Inactive
static const std::string Running