int main(int argc, char* argv[]) { try { if(argc != 3) { //TODO: help message std::cout << "\n<< Help usage message >>\n" << std::endl; return SERVICE_PARAMETERS_ERROR; } std::string serviceType(argv[1]); std::transform(serviceType.begin(), serviceType.end(), serviceType.begin(), ::tolower); if(!checkServiceType(serviceType)) return UNKNOWN_SERVICE_TYPE; int listeningPort = std::stoi(argv[2]); try { terrama2::core::initializeTerraMA(); terrama2::core::registerFactories(); } catch(...) { return TERRAMA2_INITIALIZATION_ERROR; } auto& serviceManager = terrama2::core::ServiceManager::getInstance(); serviceManager.setServiceType(serviceType); serviceManager.setListeningPort(listeningPort); // service context // this is needed for calling the destructor of the service before finalizing terralib { // Must initialize the python interpreter before creating any thread. terrama2::services::analysis::core::initInterpreter(); QCoreApplication app(argc, argv); std::shared_ptr<terrama2::core::DataManager> dataManager; std::shared_ptr<terrama2::core::Service> service; std::shared_ptr<terrama2::core::ProcessLogger> logger; std::tie(dataManager, service, logger) = createService(serviceType); if(!service.get() || !dataManager.get()) return SERVICE_LOAD_ERROR; auto tcpManager = std::make_shared<terrama2::core::TcpManager>(dataManager, logger); if(!tcpManager->listen(QHostAddress::Any, serviceManager.listeningPort())) { std::cerr << QObject::tr("\nUnable to listen to port: ").toStdString() << serviceManager.listeningPort() << "\n" << std::endl; exit(TCP_SERVER_ERROR); } QObject::connect(&serviceManager, &terrama2::core::ServiceManager::listeningPortUpdated, tcpManager.get(), &terrama2::core::TcpManager::updateListeningPort); QObject::connect(tcpManager.get(), &terrama2::core::TcpManager::startProcess, service.get(), &terrama2::core::Service::addToQueue); QObject::connect(&serviceManager, &terrama2::core::ServiceManager::numberOfThreadsUpdated, service.get(), &terrama2::core::Service::updateNumberOfThreads); QObject::connect(&serviceManager, &terrama2::core::ServiceManager::logConnectionInfoUpdated, logger.get(), &terrama2::core::ProcessLogger::setConnectionInfo); QObject::connect(tcpManager.get(), &terrama2::core::TcpManager::stopSignal, service.get(), &terrama2::core::Service::stopService); QObject::connect(tcpManager.get(), &terrama2::core::TcpManager::closeApp, &app, &QCoreApplication::quit); app.exec(); } try { terrama2::core::finalizeTerraMA(); //Service closed by load error if(!serviceManager.serviceLoaded()) return SERVICE_LOAD_ERROR; } catch(...) { return TERRAMA2_FINALIZATION_ERROR; } } catch(boost::exception& e) { TERRAMA2_LOG_ERROR() << boost::diagnostic_information(e); } catch(std::exception& e) { TERRAMA2_LOG_ERROR() << e.what(); } catch(...) { TERRAMA2_LOG_ERROR() << QObject::tr("\n\nUnkown Exception...\n"); } return 0; }
int main(int argc, char* argv[]) { try { std::string appName = boost::filesystem::basename(argv[0]); po::options_description desc("Allowed options"); desc.add_options() ("help,h", "show help message.") ("version,v", "Show TerraMA2 version.") ("service,s", po::value<std::string>()->required(), "Service to be started.\nValid options:\n\t- ANALYSIS\n\t- COLLECTOR\n\t- VIEW") ("port,p", po::value<int>()->required(), "Port the service will listen.") ; po::positional_options_description positionalOptions; positionalOptions.add("service", 1); positionalOptions.add("port", 1); po::variables_map vm; po::store(po::command_line_parser(argc, argv).options(desc) .positional(positionalOptions).run(), vm); if (vm.count("help")) { std::cout << "usage: "+appName+" [--version] [--help] service port" << "\n"; std::cout << desc << std::endl; return 0; } if (vm.count("version")) { std::cout << "TerraMA2 " << TERRAMA2_VERSION_STRING << std::endl; return 0; } po::notify(vm); std::string serviceType(vm["service"].as<std::string>()); std::transform(serviceType.begin(), serviceType.end(), serviceType.begin(), ::tolower); if(!checkServiceType(serviceType)) return UNKNOWN_SERVICE_TYPE; int listeningPort = vm["port"].as<int>(); terrama2::core::TerraMA2Init terramaRaii(serviceType, listeningPort); terrama2::core::registerFactories(); auto& serviceManager = terrama2::core::ServiceManager::getInstance(); serviceManager.setServiceType(serviceType); serviceManager.setListeningPort(listeningPort); // service context // this is needed for calling the destructor of the service before finalizing terralib { TERRAMA2_LOG_INFO() << QObject::tr("Initializing TerraMA2 service..."); TERRAMA2_LOG_INFO() << QObject::tr("Starting %1 service.").arg(QString::fromStdString(serviceType)); // Must initialize the python interpreter before creating any thread. terrama2::services::analysis::core::PythonInterpreterInit pythonInterpreterInit; QCoreApplication app(argc, argv); // Changes in the initialization order may cause locale problems std::locale::global(std::locale::classic()); std::shared_ptr<terrama2::core::DataManager> dataManager; std::shared_ptr<terrama2::core::Service> service; std::shared_ptr<terrama2::core::ProcessLogger> logger; std::tie(dataManager, service, logger) = createService(serviceType); if(!service.get() || !dataManager.get() || !logger.get()) return SERVICE_LOAD_ERROR; auto tcpManager = std::make_shared<terrama2::core::TcpManager>(dataManager, logger); if(!tcpManager->listen(QHostAddress::Any, serviceManager.listeningPort())) { std::cerr << QObject::tr("\nUnable to listen to port: ").toStdString() << serviceManager.listeningPort() << "\n" << std::endl; exit(TCP_SERVER_ERROR); } QObject::connect(&serviceManager, &terrama2::core::ServiceManager::listeningPortUpdated, tcpManager.get(), &terrama2::core::TcpManager::updateListeningPort); QObject::connect(tcpManager.get(), &terrama2::core::TcpManager::startProcess, service.get(), &terrama2::core::Service::addToQueue); QObject::connect(&serviceManager, &terrama2::core::ServiceManager::numberOfThreadsUpdated, service.get(), &terrama2::core::Service::updateNumberOfThreads); QObject::connect(&serviceManager, &terrama2::core::ServiceManager::logConnectionInfoUpdated, logger.get(), &terrama2::core::ProcessLogger::setConnectionInfo); QObject::connect(service.get(), &terrama2::core::Service::processFinishedSignal, tcpManager.get(), &terrama2::core::TcpManager::processFinishedSlot); QObject::connect(tcpManager.get(), &terrama2::core::TcpManager::stopSignal, service.get(), &terrama2::core::Service::stopService); QObject::connect(service.get(), &terrama2::core::Service::serviceFinishedSignal, &app, &QCoreApplication::quit); app.exec(); } try { //Service closed by load error if(!serviceManager.serviceLoaded()) return SERVICE_LOAD_ERROR; } catch(...) { return TERRAMA2_FINALIZATION_ERROR; } } catch(boost::program_options::error& e) { std::cout << "Invalid options.See 'terrama2_service --help'\n" << std::endl; TERRAMA2_LOG_ERROR() << e.what(); } catch(boost::exception& e) { TERRAMA2_LOG_ERROR() << boost::diagnostic_information(e); } catch(std::exception& e) { TERRAMA2_LOG_ERROR() << e.what(); } catch(...) { TERRAMA2_LOG_ERROR() << QObject::tr("\n\nUnknown Exception...\n"); } return 0; }