X-Git-Url: https://git.teslayout.com/public/public/public/?a=blobdiff_plain;f=example%2Fdiameter%2Flauncher%2Fmain.cpp;h=89858b24106c837f45cb7ef9abbc4d8f22aa1a35;hb=53c634c44a9612f367bd13ba86bbd7117bf4427c;hp=90f40ba2fe2c2380f9fbcea17e7329321600e604;hpb=4e12ac57e93c052f716a6305ad8fc099c45899d1;p=anna.git diff --git a/example/diameter/launcher/main.cpp b/example/diameter/launcher/main.cpp index 90f40ba..89858b2 100644 --- a/example/diameter/launcher/main.cpp +++ b/example/diameter/launcher/main.cpp @@ -90,6 +90,9 @@ class Response; } } +#define SIGUSR2_TASKS_INPUT_FILENAME "./sigusr2.tasks.input" +#define SIGUSR2_TASKS_OUTPUT_FILENAME "./sigusr2.tasks.output" + // Auxiliary message for sendings anna::diameter::comm::Message G_commMsgSent2c, G_commMsgSent2e, G_commMsgFwd2c, G_commMsgFwd2e; @@ -166,7 +169,6 @@ private: void evRequest(anna::comm::ClientSocket&, const anna::http::Request& request) throw(anna::RuntimeException); void evResponse(anna::comm::ClientSocket&, const anna::http::Response&) throw(anna::RuntimeException) {;} - void sendOperation(const std::string &, std::string &) throw(anna::RuntimeException); }; class MyCommunicator : public anna::comm::Communicator { @@ -233,6 +235,7 @@ public: void baseProtocolSetupAsClient(void) throw(anna::RuntimeException); anna::diameter::comm::Entity *getEntity() throw() { return a_entity; } anna::diameter::comm::LocalServer* getDiameterLocalServer() throw() { return a_diameterLocalServer; } + void eventOperation(const std::string &, std::string &) throw(anna::RuntimeException); bool logEnabled() const throw() { return (((a_logFile == "") || (a_logFile == "null")) ? false : true); } void writeLogFile(const anna::DataBlock & db, const std::string &logExtension, const std::string &detail) const throw(); void writeLogFile(const anna::diameter::codec::Message & decodedMessage, const std::string &logExtension, const std::string &detail) const throw(); @@ -243,6 +246,7 @@ public: anna::xml::Node* asXML(anna::xml::Node* parent) const throw(); void resetStatistics() throw() { a_myDiameterEngine->resetStatistics(); } void resetCounters() throw(); + void signalUSR2() throw(anna::RuntimeException); std::string help() const throw(); std::string programmedAnswers2e() const throw(); std::string programmedAnswers2c() const throw(); @@ -494,35 +498,83 @@ void Launcher::resetCounters() throw() { oamDiameterComm.resetCounters(); } +void Launcher::signalUSR2() throw(anna::RuntimeException) { + + LOGNOTICE( + std::string msg = "Captured signal SIGUSR2. Reading tasks at '"; + msg += SIGUSR2_TASKS_INPUT_FILENAME; + msg += "' (results will be written at '"; + msg += SIGUSR2_TASKS_OUTPUT_FILENAME; + msg += "')"; + anna::Logger::notice(msg, ANNA_FILE_LOCATION); + ); + + // Operation: + std::string line; + std::string response_content; + + std::ifstream in_file (SIGUSR2_TASKS_INPUT_FILENAME); + std::ofstream out_file (SIGUSR2_TASKS_OUTPUT_FILENAME); + + if (!in_file.is_open()) throw RuntimeException("Unable to read tasks", ANNA_FILE_LOCATION); + if (!out_file.is_open()) throw RuntimeException("Unable to write tasks", ANNA_FILE_LOCATION); + + while (getline (in_file, line)) + { + LOGDEBUG( + std::string msg = "Processing line: "; + msg += line; + anna::Logger::debug(msg, ANNA_FILE_LOCATION); + ); + + try { + eventOperation(line, response_content); + } catch (RuntimeException &ex) { + ex.trace(); + } + out_file << response_content; + } + in_file.close(); + out_file.close(); +} + + std::string Launcher::help() const throw() { std::string result = "\n"; result += "\n ------------- HELP -------------\n"; - result += "\nThe Diameter Launcher process is a complete diameter agent with client and server"; + result += "\nThe ADL (ANNA Diameter Launcher) process is a complete diameter agent with client and server"; result += "\ncapabilities as well as balancer (proxy) features. It could be used as diameter server"; result += "\n(i.e. to simulate PCRF nodes, OCS systems, etc.), as diameter client (GGSNs, DPIs, etc.)"; result += "\nand balancer systems to provide failover to external round-robin launchers). Also, auxiliary"; result += "\nencoder/decoder/loader function could be deployed to reinterpret certain external flow and"; result += "\nsend it to another process."; result += "\n"; - result += "\nAs any other ANNA process, context dump could be retrieved sending -10 signal:"; - result += "\n kill -10 ; vi /var/tmp/anna.context."; + result += "\nAs any other ANNA process, context dump could be retrieved sending SIGUSR1 signal:"; + result += "\n kill -10 "; + result += "\n or"; + result += "\n kill -s SIGUSR1 "; + result += "\n and then"; + result += "\n vi /var/tmp/anna.context."; result += "\n"; result += "\nA complete xml report will show all the context information (counters, alarms, statistics,"; result += "\nhandlers, diameter dictionary, etc.), and a powerful log module could dump all the events"; result += "\nprocessed and flow information. Statistics could be analized at context dump and optionally"; result += "\nwritten to disk as sample files with all the events measurements."; result += "\n"; + result += "\nAlso SIGUSR2 is handled as an alternative to http operation interface."; + result += "\nWe will talk later about this management interface."; + result += "\n"; result += "\nProcess traces are dump on \"launcher.traces\" and could have any trace level (POSIX levels):"; result += "\nusually 'debug' or 'warning'. See ANNA documentation."; result += "\n"; - result += "\nThe ANNA::diameter built-in module provide a great set of characteristics as multiple connections"; + result += "\nThe ANNA::diameter_comm built-in module provide a great set of characteristics as multiple connections"; result += "\non both server and client side, definition for multiple-server entities (and not only two as standard"; result += "\nestablish as minimum), separate statistics analyzer per each resource, automatic CER/CEA and DWR/DWA"; result += "\ngeneration, expiration control and many more features"; result += "\n"; result += "\nOPERATIONS INTERFACE"; result += "\n"; - result += "\nNDL supports several operations via HTTP interface. The HTTP request body content will"; + result += "\nADL supports several operations via HTTP interface. The HTTP request body content will"; result += "\nbe an string with a command:"; result += "\n"; result += "\nFor example, we could launch an operation via curl:"; @@ -630,6 +682,20 @@ std::string Launcher::help() const throw() { result += "\n burst|look| Show programmed burst message for order provided."; result += "\n"; result += "\n"; + result += "\nAnother way to execute operations is to create a task file and send SIGUSR2 signal to interpret it:"; + result += "\n echo \"<\" > "; result += SIGUSR2_TASKS_INPUT_FILENAME; + result += "\n then"; + result += "\n kill -12 "; + result += "\n or"; + result += "\n kill -s SIGUSR2 "; + result += "\n and then see the results:"; + result += "\n cat "; result += SIGUSR2_TASKS_OUTPUT_FILENAME; + result += "\n"; + result += "\nYou could place more than one line (task) in the input file. Output reports will be appended in that"; + result += "\n case over the output file."; + result += "\n"; + result += "\n"; + return result; } @@ -745,7 +811,7 @@ int main(int argc, const char** argv) { commandLine.add("logStatisticSamples", anna::CommandLine::Argument::Optional, "Log statistics samples for the provided concept id list, over './sample..csv' files. For example: \"1,2\" will log concepts 1 and 2. Reserved word \"all\" activates all registered statistics concept identifiers. That ids are shown at context dump (see help to get it)."); commandLine.add("burstLog", anna::CommandLine::Argument::Optional, "Burst operations log file. By default 'launcher.burst'. Empty string or \"null\" name, to disable. Warning: there is no rotation for log files (use logrotate or whatever). Output: dot (.) for each burst message sent/pushed, cross (x) for popped ones, and order number when multiple of 1% of burst list size, plus OTA requests when changed."); // Communications - commandLine.add("httpServer", anna::CommandLine::Argument::Mandatory, "HTTP Management interface address (using i.e. curl tool) in '
:' format. For example: 10.20.30.40:8080"); + commandLine.add("httpServer", anna::CommandLine::Argument::Optional, "HTTP Management interface address (using i.e. curl tool) in '
:' format. For example: 10.20.30.40:8080"); commandLine.add("httpServerShared", anna::CommandLine::Argument::Optional, "Enables shared bind for HTTP Management interface address. It would be useful i.e. to allow a great amount of curl operations per second", false); commandLine.add("diameterServer", anna::CommandLine::Argument::Optional, "Diameter own server address in '
:' format. For example: 10.20.30.40:3868"); commandLine.add("diameterServerSessions", anna::CommandLine::Argument::Optional, "Diameter own server available connections (0: diameter server disabled). Default value of 1"); @@ -781,7 +847,7 @@ int main(int argc, const char** argv) { Launcher::Launcher() : anna::comm::Application("launcher", "DiameterLauncher", "1.1"), a_communicator(NULL) { a_myDiameterEngine = new MyDiameterEngine(); - a_myDiameterEngine->setRealm("NDL.ericsson.com"); + a_myDiameterEngine->setRealm("ADL.ericsson.com"); a_myDiameterEngine->setAutoBind(false); // allow to create client-sessions without binding them, in order to set timeouts. //a_myDiameterEngine->setFreezeEndToEndOnSending(); a_logFile = "launcher.log"; @@ -1205,13 +1271,16 @@ throw(anna::RuntimeException) { anna::Logger::information(msg, ANNA_FILE_LOCATION); ); // HTTP Server: - anna::comm::Network& network = anna::comm::Network::instantiate(); - std::string address; - int port; - anna::functions::getAddressAndPortFromSocketLiteral(cl.getValue("httpServer"), address, port); -// const anna::comm::Device* device = network.find(Device::asAddress(address)); // aqui hay que proporcionar una IP ! - const anna::comm::Device* device = *((network.resolve(address)->device_begin())); // ArtimaƱa para resolver (IP o hostname) - a_httpServerSocket = new anna::comm::ServerSocket(anna::comm::INetAddress(device, port), cl.exists("httpServerShared") /* shared bind */, &anna::http::Transport::getFactory()); + if (cl.exists("httpServer")) { + anna::comm::Network& network = anna::comm::Network::instantiate(); + std::string address; + int port; + anna::functions::getAddressAndPortFromSocketLiteral(cl.getValue("httpServer"), address, port); + //const anna::comm::Device* device = network.find(Device::asAddress(address)); // aqui hay que proporcionar una IP ! + const anna::comm::Device* device = *((network.resolve(address)->device_begin())); // ArtimaƱa para resolver (IP o hostname) + a_httpServerSocket = new anna::comm::ServerSocket(anna::comm::INetAddress(device, port), cl.exists("httpServerShared") /* shared bind */, &anna::http::Transport::getFactory()); + } + // Stack: anna::diameter::codec::Engine *codecEngine = new anna::diameter::codec::Engine(); anna::diameter::stack::Engine &stackEngine = anna::diameter::stack::Engine::instantiate(); @@ -1348,7 +1417,7 @@ throw(anna::RuntimeException) { } a_communicator->setRecoveryTime((const anna::Millisecond)reconnectionPeriod); - a_communicator->attach(a_httpServerSocket); // HTTP + if (cl.exists("httpServer")) a_communicator->attach(a_httpServerSocket); // HTTP a_communicator->accept(); } @@ -1385,7 +1454,8 @@ throw(anna::RuntimeException) { std::string response_content; try { - sendOperation(body_content, response_content); + Launcher& my_app = static_cast (anna::app::functions::getApp()); + my_app.eventOperation(body_content, response_content); } catch (RuntimeException &ex) { ex.trace(); } @@ -1410,9 +1480,8 @@ throw(anna::RuntimeException) { } } -void MyHandler::sendOperation(const std::string &operation, std::string &response_content) throw(anna::RuntimeException) { - LOGMETHOD(anna::TraceMethod tm("MyHandler", "sendOperation", ANNA_FILE_LOCATION)); - Launcher& my_app = static_cast (anna::app::functions::getApp()); +void Launcher::eventOperation(const std::string &operation, std::string &response_content) throw(anna::RuntimeException) { + LOGMETHOD(anna::TraceMethod tm("Launcher", "eventOperation", ANNA_FILE_LOCATION)); CommandLine& cl(anna::CommandLine::instantiate()); LOGDEBUG(anna::Logger::debug(operation, ANNA_FILE_LOCATION)); response_content = "Operation processed with exception. See traces\n"; // supposed @@ -1420,15 +1489,15 @@ void MyHandler::sendOperation(const std::string &operation, std::string &respons // Help: if (operation == "help") { - std::cout << my_app.help() << std::endl; + std::cout << help() << std::endl; response_content = "Help dumped on stdout and information-level traces (launcher.traces file)\n"; return; } // Reset performance data: if (operation == "collect") { - my_app.resetCounters(); - my_app.resetStatistics(); + resetCounters(); + resetStatistics(); response_content = "All process counters & statistic information have been reset\n"; return; } @@ -1440,7 +1509,7 @@ void MyHandler::sendOperation(const std::string &operation, std::string &respons //LOGDEBUG(anna::Logger::debug(anna::functions::asString("Number of operation parameters: %d", numParams), ANNA_FILE_LOCATION)); if (numParams > 2) { - LOGWARNING(anna::Logger::warning(my_app.help(), ANNA_FILE_LOCATION)); + LOGWARNING(anna::Logger::warning(help(), ANNA_FILE_LOCATION)); throw anna::RuntimeException("Wrong body content format on HTTP Request", ANNA_FILE_LOCATION); } @@ -1483,7 +1552,7 @@ void MyHandler::sendOperation(const std::string &operation, std::string &respons outfile.close(); infile.close(); } else if ((opType == "hide") || (opType == "show") || (opType == "hidden") || (opType == "shown")) { - anna::diameter::comm::Entity *entity = my_app.getEntity(); + anna::diameter::comm::Entity *entity = getEntity(); if (!entity) throw anna::RuntimeException("No entity configured to send messages", ANNA_FILE_LOCATION); @@ -1493,25 +1562,25 @@ void MyHandler::sendOperation(const std::string &operation, std::string &respons key += "|"; key += param2; - if (opType == "hide") my_app.getMyDiameterEngine()->findClientSession(key)->hide(); + if (opType == "hide") getMyDiameterEngine()->findClientSession(key)->hide(); - if (opType == "show") my_app.getMyDiameterEngine()->findClientSession(key)->show(); + if (opType == "show") getMyDiameterEngine()->findClientSession(key)->show(); - if (opType == "hidden") result = my_app.getMyDiameterEngine()->findClientSession(key)->hidden() ? "true" : "false"; + if (opType == "hidden") result = getMyDiameterEngine()->findClientSession(key)->hidden() ? "true" : "false"; - if (opType == "shown") result = my_app.getMyDiameterEngine()->findClientSession(key)->shown() ? "true" : "false"; + if (opType == "shown") result = getMyDiameterEngine()->findClientSession(key)->shown() ? "true" : "false"; } else { std::string address; int port; anna::functions::getAddressAndPortFromSocketLiteral(param1, address, port); - if (opType == "hide") my_app.getMyDiameterEngine()->findServer(address, port)->hide(); + if (opType == "hide") getMyDiameterEngine()->findServer(address, port)->hide(); - if (opType == "show") my_app.getMyDiameterEngine()->findServer(address, port)->show(); + if (opType == "show") getMyDiameterEngine()->findServer(address, port)->show(); - if (opType == "hidden") result = my_app.getMyDiameterEngine()->findServer(address, port)->hidden() ? "true" : "false"; + if (opType == "hidden") result = getMyDiameterEngine()->findServer(address, port)->hidden() ? "true" : "false"; - if (opType == "shown") result = my_app.getMyDiameterEngine()->findServer(address, port)->shown() ? "true" : "false"; + if (opType == "shown") result = getMyDiameterEngine()->findServer(address, port)->shown() ? "true" : "false"; } } else { if (opType == "hide") entity->hide(); @@ -1526,7 +1595,7 @@ void MyHandler::sendOperation(const std::string &operation, std::string &respons if (numParams != 1) throw anna::RuntimeException("Wrong body content format on HTTP Request for 'sendxml/sendxml2e' operation (missing parameter)", ANNA_FILE_LOCATION); - anna::diameter::comm::Entity *entity = my_app.getEntity(); + anna::diameter::comm::Entity *entity = getEntity(); if (!entity) throw anna::RuntimeException("No entity configured to send the message", ANNA_FILE_LOCATION); @@ -1538,17 +1607,17 @@ void MyHandler::sendOperation(const std::string &operation, std::string &respons bool success = entity->send(G_commMsgSent2e, cl.exists("balance")); // Detailed log: - if (my_app.logEnabled()) { + if (logEnabled()) { anna::diameter::comm::Server *usedServer = entity->getLastUsedResource(); anna::diameter::comm::ClientSession *usedClientSession = usedServer ? usedServer->getLastUsedResource() : NULL; std::string detail = usedClientSession ? usedClientSession->asString() : ""; // esto no deberia ocurrir - my_app.writeLogFile(G_codecMsg, (success ? "sent2e" : "send2eError"), detail); + writeLogFile(G_codecMsg, (success ? "sent2e" : "send2eError"), detail); } } else if ((opType == "burst")) { if (numParams < 1) throw anna::RuntimeException("Wrong body content format on HTTP Request for 'burst' operation (missing action parameter)", ANNA_FILE_LOCATION); - anna::diameter::comm::Entity *entity = my_app.getEntity(); + anna::diameter::comm::Entity *entity = getEntity(); if (!entity) throw anna::RuntimeException("No entity configured to use burst feature", ANNA_FILE_LOCATION); @@ -1567,7 +1636,7 @@ void MyHandler::sendOperation(const std::string &operation, std::string &respons if (param1 == "clear") { result = "Removed "; - result += anna::functions::asString(my_app.clearBurst()); + result += anna::functions::asString(clearBurst()); result += " elements."; } else if (param1 == "load") { if (param2 == "") throw anna::RuntimeException("Missing xml path file for burst load operation", ANNA_FILE_LOCATION); @@ -1577,7 +1646,7 @@ void MyHandler::sendOperation(const std::string &operation, std::string &respons if (G_codecMsg.isAnswer()) throw anna::RuntimeException("Cannot load diameter answers for burst feature", ANNA_FILE_LOCATION); try { G_codecMsg.valid(); } catch (anna::RuntimeException &ex) { ex.trace(); } // at least we need to see validation errors although it will continue loading (see validation mode configured in launcher) - int position = my_app.loadBurstMessage(G_codecMsg.code()); + int position = loadBurstMessage(G_codecMsg.code()); result = "Loaded '"; result += param2; result += "' file into burst list position "; @@ -1586,7 +1655,7 @@ void MyHandler::sendOperation(const std::string &operation, std::string &respons if (param2 == "") throw anna::RuntimeException("Missing initial load for burst start operation", ANNA_FILE_LOCATION); int initialLoad = atoi(param2.c_str()); - int processed = my_app.startBurst(initialLoad); + int processed = startBurst(initialLoad); if (processed > 0) { result = "Initial load completed for "; @@ -1596,7 +1665,7 @@ void MyHandler::sendOperation(const std::string &operation, std::string &respons } else if (param1 == "push") { if (param2 == "") throw anna::RuntimeException("Missing load amount for burst push operation", ANNA_FILE_LOCATION); - int pushed = my_app.pushBurst(atoi(param2.c_str())); + int pushed = pushBurst(atoi(param2.c_str())); if (pushed > 0) { result = "Pushed "; @@ -1607,7 +1676,7 @@ void MyHandler::sendOperation(const std::string &operation, std::string &respons if (param2 == "") throw anna::RuntimeException("Missing amount for burst pop operation", ANNA_FILE_LOCATION); int releaseLoad = atoi(param2.c_str()); - int popped = my_app.popBurst(releaseLoad); + int popped = popBurst(releaseLoad); if (popped > 0) { result = "Burst popped for "; @@ -1615,7 +1684,7 @@ void MyHandler::sendOperation(const std::string &operation, std::string &respons result += "."; } } else if (param1 == "stop") { - int left = my_app.stopBurst(); + int left = stopBurst(); if (left != -1) { result += anna::functions::entriesAsString(left, "message"); @@ -1625,12 +1694,12 @@ void MyHandler::sendOperation(const std::string &operation, std::string &respons if (param2 == "") param2 = "yes"; bool repeat = (param2 == "yes"); - my_app.repeatBurst(repeat); + repeatBurst(repeat); result += (repeat ? "Mode on." : "Mode off."); } else if (param1 == "send") { if (param2 == "") throw anna::RuntimeException("Missing amount for burst send operation", ANNA_FILE_LOCATION); - int sent = my_app.sendBurst(atoi(param2.c_str())); + int sent = sendBurst(atoi(param2.c_str())); if (sent > 0) { result = "Sent "; @@ -1640,13 +1709,13 @@ void MyHandler::sendOperation(const std::string &operation, std::string &respons } else if (param1 == "goto") { if (param2 == "") throw anna::RuntimeException("Missing order position for burst goto operation", ANNA_FILE_LOCATION); - result = my_app.gotoBurst(atoi(param2.c_str())); + result = gotoBurst(atoi(param2.c_str())); result += "."; } else if (param1 == "look") { if (param2 == "") throw anna::RuntimeException("Missing order position for burst look operation", ANNA_FILE_LOCATION); result = "\n\n"; - result += my_app.lookBurst(atoi(param2.c_str())); + result += lookBurst(atoi(param2.c_str())); result += "\n\n"; } else { throw anna::RuntimeException("Wrong body content format on HTTP Request for 'burst' operation (unexpected action parameter). See help", ANNA_FILE_LOCATION); @@ -1655,7 +1724,7 @@ void MyHandler::sendOperation(const std::string &operation, std::string &respons if (numParams != 1) throw anna::RuntimeException("Wrong body content format on HTTP Request for 'sendxml2c' operation (missing parameter)", ANNA_FILE_LOCATION); - anna::diameter::comm::LocalServer *localServer = my_app.getDiameterLocalServer(); + anna::diameter::comm::LocalServer *localServer = getDiameterLocalServer(); if (!localServer) throw anna::RuntimeException("No local server configured to send the message", ANNA_FILE_LOCATION); @@ -1667,10 +1736,10 @@ void MyHandler::sendOperation(const std::string &operation, std::string &respons bool success = localServer->send(G_commMsgSent2c); // Detailed log: - if (my_app.logEnabled()) { + if (logEnabled()) { anna::diameter::comm::ServerSession *usedServerSession = localServer->getLastUsedResource(); std::string detail = usedServerSession ? usedServerSession->asString() : ""; // esto no deberia ocurrir - my_app.writeLogFile(G_codecMsg, (success ? "sent2c" : "send2cError"), detail); + writeLogFile(G_codecMsg, (success ? "sent2c" : "send2cError"), detail); } } else if (opType == "loadxml") { if (numParams != 1) @@ -1685,12 +1754,12 @@ void MyHandler::sendOperation(const std::string &operation, std::string &respons int diameterServerSessions = atoi(param1.c_str()); - if (!my_app.getDiameterLocalServer()) - my_app.startDiameterServer(diameterServerSessions); + if (!getDiameterLocalServer()) + startDiameterServer(diameterServerSessions); else - my_app.getDiameterLocalServer()->setMaxConnections(diameterServerSessions); + getDiameterLocalServer()->setMaxConnections(diameterServerSessions); } else if ((opType == "answerxml") || (opType == "answerxml2c")) { - anna::diameter::comm::LocalServer *localServer = my_app.getDiameterLocalServer(); + anna::diameter::comm::LocalServer *localServer = getDiameterLocalServer(); if (!localServer) throw anna::RuntimeException("Operation not applicable (no own diameter server has been configured)", ANNA_FILE_LOCATION); @@ -1716,12 +1785,12 @@ void MyHandler::sendOperation(const std::string &operation, std::string &respons G_reactingAnswers2C[code] = message; } else { // answers query on stdout - std::cout << my_app.programmedAnswers2c() << std::endl; + std::cout << programmedAnswers2c() << std::endl; response_content = "Programmed answers dumped on stdout\n"; return; } } else if ((opType == "answerxml2e")) { - anna::diameter::comm::Entity *entity = my_app.getEntity(); + anna::diameter::comm::Entity *entity = getEntity(); if (!entity) throw anna::RuntimeException("Operation not applicable (no diameter entity has been configured)", ANNA_FILE_LOCATION); @@ -1747,12 +1816,12 @@ void MyHandler::sendOperation(const std::string &operation, std::string &respons G_reactingAnswers2E[code] = message; } else { // answers query on stdout - std::cout << my_app.programmedAnswers2e() << std::endl; + std::cout << programmedAnswers2e() << std::endl; response_content = "Programmed answers dumped on stdout\n"; return; } } else { - LOGWARNING(anna::Logger::warning(my_app.help(), ANNA_FILE_LOCATION)); + LOGWARNING(anna::Logger::warning(help(), ANNA_FILE_LOCATION)); throw anna::RuntimeException("Wrong body content format on HTTP Request. Unsupported/unrecognized operation type", ANNA_FILE_LOCATION); }