From ea1b80f8fd0c1b806460f98f4e4cf433698857d9 Mon Sep 17 00:00:00 2001 From: "Eduardo Ramos Testillano (eramedu)" Date: Tue, 28 Apr 2020 16:20:15 +0200 Subject: [PATCH] Remove operation help. Created a new version in file: HELP.md --- example/diameter/launcher/Launcher.cpp | 756 ++---------------- example/diameter/launcher/Launcher.hpp | 1 - example/diameter/launcher/MyHandler.cpp | 4 +- example/diameter/launcher/deploy-adml-http.sh | 3 + example/diameter/launcher/deploy-aots.sh | 3 + example/diameter/launcher/deploy.sh | 5 +- .../launcher/deployments/advanced/README | 6 +- .../launcher/deployments/advanced/help.sh | 6 - .../launcher/deployments/basic/README | 4 +- .../launcher/deployments/basic/configure.sh | 1 - .../launcher/deployments/ft-client/README | 4 +- .../launcher/deployments/st-client/README | 3 +- .../deployments/st-client/operation_all.sh | 7 - .../launcher/deployments/st-client/program.sh | 24 +- .../services_example/dictionaryBase.xml | 2 +- .../services_example/dictionaryGx.xml | 2 +- .../services_example/dictionaryRx.xml | 2 +- example/diameter/launcher/main.cpp | 6 +- example/diameter/launcher/resources/HELP.md | 527 ++++++++++++ .../resources/scripts/operation_curl.sh | 2 +- .../resources/scripts/operation_signal.sh | 12 +- .../resources/services_examples/services.dtd | 5 +- 22 files changed, 618 insertions(+), 767 deletions(-) delete mode 100755 example/diameter/launcher/deployments/advanced/help.sh create mode 100644 example/diameter/launcher/resources/HELP.md diff --git a/example/diameter/launcher/Launcher.cpp b/example/diameter/launcher/Launcher.cpp index 07c2e1b..0c4a5bd 100644 --- a/example/diameter/launcher/Launcher.cpp +++ b/example/diameter/launcher/Launcher.cpp @@ -118,8 +118,8 @@ const char *ServicesDTD = "\ log: Process log file (operations result, traffic log, etc.). By default '.launcher.log'.\n\ Empty string or \"null\" name, to disable. Warning: there is no rotation for log files\n\ (use logrotate or whatever you consider).\n\ - splitLog: Splits log file (appends to log filename, extensions with the type of event: see help on\n\ - startup information-level traces). No log files for code/decode and load operations are created.\n\ + splitLog: Splits log file (appends to log filename, extensions with the type of event.\n\ + (Check 'HELP.md' for more information). No log files for code/decode and load operations are created.\n\ Default value 'no'.\n\ detailedLog: Insert detailed information at log files (timestamps, communication resources, etc.). Useful\n\ to analyze the messages flow along the sockets (specially on 'balance' mode). Default 'no'.\n\ @@ -644,8 +644,6 @@ throw(anna::RuntimeException) { anna::statistics::Engine::instantiate().enable(); LOGINFORMATION( - // Help on startup traces: - anna::Logger::information(help(), ANNA_FILE_LOCATION); // Test messages dtd: std::string msg = "\n ------------- TESTMESSAGES DTD -------------\n"; msg += anna::diameter::codec::MessageDTD; @@ -926,670 +924,6 @@ void Launcher::signalUSR2() throw(anna::RuntimeException) { out_file.close(); } -std::string Launcher::help() const throw() { - std::string result = "\n"; - result += "\n ------------- HELP -------------\n"; - result += "\n"; - result += "\nOVERVIEW"; - result += "\n--------"; - result += "\n"; - result += "\nThe ADML (ANNA Diameter MultiHost Launcher) process is a multi-host node with client and server"; - result += "\n capabilities as well as balancer (proxy) features. It could be used as diameter server (i.e. to"; - result += "\n simulate PCRF nodes, OCS systems, etc.), as diameter client (GGSNs, DPIs, etc.), and balancer"; - result += "\n systems to provide failover to external round-robin launchers. Also, auxiliary encoder/decoder/loader"; - result += "\n function could be deployed to reinterpret certain external flow and send it to another process."; - result += "\n "; - result += "\nThe ANNA::diameter_comm built-in module provides a great set of characteristics as multiple connections"; - result += "\n on both server and client side, definition for multiple-server entities (and not only two as standard"; - result += "\n establish as minimum), separate statistics analyzer per each resource, automatic CER/CEA and DWR/DWA"; - result += "\n generation, expiration control and many more features."; - result += "\n"; - result += "\nThe ADML process can easily configure a many origin-host nodes as needed, which will have own endpoints."; - result += "\nYou should avoid loop configurations (client and server for that client) because automatic forwarding,"; - result += "\n is implemented and this would get in a never ending cycle when a request is sent."; - result += "\n"; - result += "\nProcess traces are dump on \"launcher.trace\" and could have any trace level (POSIX levels), usually"; - result += "\n 'debug' or 'warning'. See ANNA documentation for more details."; - result += "\n"; - 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 += "\n handlers, diameter stacks, etc.), and a powerful log module could dump all the events"; - result += "\n processed and flow information. Statistics could be analized at context dump and optionally"; - result += "\n written to disk as sample files (useful for graphs and spreadsheet reports) with all the"; - result += "\n measurements."; - result += "\n"; - result += "\nAlso SIGUSR2 is handled for management purposes. We will talk later about this."; - result += "\n"; - result += "\n"; - result += "\nCOMMAND LINE"; - result += "\n------------"; - result += "\n"; - result += "\nStart the launcher process without arguments in order to see all the startup configuration"; - result += "\n posibilities, many of which could be modified on the air through the management interface"; - result += "\n (we will talk later about this great feature). There is only one mandatory parameter which"; - result += "\n is the services definition: --services . You must follow the dtd schema"; - result += "\n to build a valid services xml file. Some basic examples are:"; - result += "\n"; - result += "\nClient configuration:"; - result += "\n"; - result += "\n"; - result += "\n "; - result += "\n "; - result += "\n"; - result += "\n "; - result += "\n "; - result += "\n"; - result += "\n"; - result += "\nServer configuration:"; - result += "\n"; - result += "\n"; - result += "\n "; - result += "\n "; - result += "\n"; - result += "\n "; - result += "\n "; - result += "\n"; - result += "\n"; - result += "\nIf you act as a proxy or a translation agent, you need to combine both former setups, and probably"; - result += "\n will need to program the answers to be replied through the operations interface. To balance the"; - result += "\n traffic at your client side you shall use '--balance' and '--sessionBasedModelsClientSocketSelection'"; - result += "\n arguments in order to define the balancing behaviour. To make hybrid setups you only must mix the nodes:"; - result += "\n"; - result += "\nClient and server configuration:"; - result += "\n"; - result += "\n"; - result += "\n "; - result += "\n "; - result += "\n "; - result += "\n "; - result += "\n"; - result += "\n "; - result += "\n "; - result += "\n "; - result += "\n"; - result += "\n"; - result += "\n"; - result += "\nThe process builds automatically CER and DWR messages as a client, but you could specify your own"; - result += "\n as shown in the hybrid former example. Note that the base protocol stack must be registered because"; - result += "\n the configuration corresponds to a multistack process which change the stack using the application-id"; - result += "\n processed (0 in the case of base protocol messages: CER, CEA, DWR, DWA, DPR, DPA)."; - result += "\n"; - result += "\nDYNAMIC OPERATIONS"; - result += "\n------------------"; - result += "\n"; - result += "\nADML supports several operations which could be reconized via HTTP interface or SIGUSR2 caugh."; - result += "\nAn operation is specified by mean a string containing the operation name and needed arguments"; - result += "\n separated by pipes. These are the available commands:"; - result += "\n"; - result += "\n--------------------------------------------------------------------------------------- General purpose"; - result += "\n"; - result += "\nhelp This help."; - result += "\n"; - result += "\n--------------------------------------------------------------------------------------- Node management"; - result += "\n"; - result += "\nnode[|] Selects a context working node by mean a registered name (origin-host)."; - result += "\n All the subsequent operations will be forced to work with"; - result += "\n this node, which makes possible some rare scenarios like"; - result += "\n sending unexpected messages on remote peers. This is also"; - result += "\n useful for some operations in order to restrict the scope"; - result += "\n of action (statistics, communication visibility, etc.)."; - result += "\n Empty parameter will show the current configuration."; - result += "\n"; - result += "\nnode_auto Returns to the default behaviour (smart node selection)."; - result += "\n Depending on the operation, this could imply a global"; - result += "\n action scope, affecting to all the registered hosts."; - result += "\n This should be the normal configuration. Take into"; - result += "\n account that if you fix the working node, this could"; - result += "\n affect to things like test programming: communication"; - result += "\n resources will override those which would be inferred"; - result += "\n from programmed messages Origin-Host avps."; - result += "\n"; - result += "\n------------------------------------------------------------------------------------ Parsing operations"; - result += "\n"; - result += "\ncode|| Encodes source file (pathfile) into target file (pathfile)."; - result += "\ndecode|| Decodes source file (pathfile) into target file (pathfile)."; - result += "\nloadxml| Reinterpret xml source file (pathfile)."; - result += "\n"; - result += "\n------------------------------------------------------------------------------------------- Hot changes"; - result += "\n"; - result += "\nservices[|source file] Adds and starts the services specified in the xml file provided."; - result += "\n (if missing, the file 'services.xml' will be used). This is used"; - result += "\n to load new nodes once the ADML is started, regardless if command"; - result += "\n line '--services' parameter was used or not. Those services which"; - result += "\n are not correctly loaded will be ignored to keep the process alive."; - result += "\n If you need to load services as deltas, you must firstly load the"; - result += "\n diameter base dictionary with stack id 0, because all the nodes"; - result += "\n will use this dictionary to encode/decode base protocol messages"; - result += "\n managed by the communication engine."; - result += "\n"; - result += "\ndiameterServerSessions| Updates the maximum number of accepted connections to diameter"; - result += "\n server socket."; - result += "\ncontext[|target file] Application context could also be written by mean this operation,"; - result += "\n and not only through SIGUSR1. If optional path file is missing,"; - result += "\n default '/var/tmp/anna.context.' will be used."; - result += "\ncollect Reset statistics and counters to start a new test stage of"; - result += "\n performance measurement. Context data can be written at"; - result += "\n '/var/tmp/anna.context.' by mean 'kill -10 '."; - result += "\n or sending operation 'context|[target file]'."; - result += "\n This operation applies over all the registered host nodes"; - result += "\n except if one specific working node has been set."; - result += "\nforceCountersRecord Forces dump to file the current counters of the process."; - result += "\nlog-statistics-samples| Log statistics samples for the provided comma-separated concept id"; - result += "\n list, over './sample..csv' files. For example: \"1,2\""; - result += "\n will log concepts 1 and 2. Reserved words \"all\"/\"none\" activates/"; - result += "\n deactivates all registered statistics concept identifiers. That ids"; - result += "\n are shown at context dump."; - result += "\nchange-dir[|directory] Changes the execution point which could be fine to ease some"; - result += "\n file system interaction tasks. Be care about some requirements"; - result += "\n (for example if you have a user defined counters directory as"; - result += "\n relative path this must exists from the new execution directory)."; - result += "\n If nothing provided, initial working directory will be restored."; - result += "\nshow-oam Dumps current counters of the process. This is also done at"; - result += "\n process context dump."; - result += "\nshow-stats Dumps statistics of the process. This is also done at process"; - result += "\n context dump."; - result += "\n"; - result += "\n[|
:][|socket id]"; - result += "\n"; - result += "\n Actions: hide, show (update state) and hidden, shown (query state)."; - result += "\n Acts over a client session for messages delivery (except CER/A, DWR/A, DPR/A)."; - result += "\n If missing server (first parameter) all applications sockets will be affected."; - result += "\n If missing socket (second parameter) for specific server, all its sockets will be affected."; - result += "\n"; - result += "\n All application client sessions are shown on startup, but standard delivery only use primary"; - result += "\n server ones except if fails. Balance configuration use all the allowed sockets. You could also"; - result += "\n use command line 'sessionBasedModelsClientSocketSelection' to force traffic flow over certain"; - result += "\n client sessions, but for this, hide/show feature seems easier."; - result += "\n"; - result += "\n--------------------------------------------------------------------------------------- Flow operations"; - result += "\n"; - result += "\nsendxml2e| Sends xml source file (pathfile) through configured entity."; - result += "\nsendxml2c| Sends xml source file (pathfile) to client."; - result += "\nanswerxml2e[|source_file] Answer xml source file (pathfile) for incoming request with same code from entity."; - result += "\n The answer is stored in a FIFO queue for a specific message code, then there are"; - result += "\n as many queues as different message codes have been programmed."; - result += "\nanswerxml2c[|source_file] Answer xml source file (pathfile) for incoming request with same code from client."; - result += "\n The answer is stored in a FIFO queue for a specific message code, then there are"; - result += "\n as many queues as different message codes have been programmed."; - result += "\nanswerxml<2e/2c> List programmed answers (to entity/client) if no parameter provided."; - result += "\nanswerxml<2e/2c>|dump Write programmed answers (to entity/client) to file 'programmed_answer..',"; - result += "\n where 'sequence' is the order of the answer in each FIFO code-queue of programmed answers."; - result += "\nanswerxml<2e/2c>|clear Clear programmed answers (to entity/client)."; - result += "\nanswerxml<2e/2c>|exhaust Disable the corresponding queue rotation, which is the default behaviour."; - result += "\nanswerxml<2e/2c>|rotate Enable the corresponding queue rotation, useful in performance tests."; - result += "\n Rotation consists in add again to the queue, each element retrieved for answering."; - result += "\n"; - result += "\nSend operations are available using hexadecimal content (hex formatted files) which also allow to test"; - result += "\nspecial scenarios (protocol errors):"; - result += "\n"; - result += "\nsendhex2e| Sends hex source file (pathfile) through configured entity."; - result += "\nsendhex2c| Sends hex source file (pathfile) to client."; - result += "\n"; - result += "\nAnswer programming in hexadecimal is not really neccessary (you could use send primitives) and also"; - result += "\n is intended to be used with decoded messages in order to replace things like hop by hop, end to end,"; - result += "\n subscriber id, session id, etc. Anyway you could use 'decode' operation and then program the xml created."; - result += "\n"; - result += "\nIf a request is received, answer map (built with 'answerxml<2e/2c>' operations) will be"; - result += "\n checked to find a corresponding programmed answer to be replied(*). If no ocurrence is found,"; - result += "\n or answer message was received, the message is forwarded to the other side (entity or client),"; - result += "\n or nothing but trace when no peer at that side is configured. Answer to client have sense when"; - result += "\n diameter server socket is configured, answer to entity have sense when entity does."; - result += "\n"; - result += "\nIn the most complete situation (process with both client and server side) there are internally"; - result += "\n two maps with N FIFO queues, one for each different message code within programmed answers."; - result += "\nOne map is for answers towards the client, and the other is to react entity requests. Then in"; - result += "\n each one we could program different answers corresponding to different request codes received."; - result += "\n"; - result += "\n(*) sequence values (hop-by-hop and end-to-end), Session-Id and Subscription-Id avps, are mirrored"; - result += "\n to the peer which sent the request. If user wants to test a specific answer without changing it,"; - result += "\n use sendxml<2e/2c>/sendhex<2e/2c> operations better than programming."; - result += "\n"; - result += "\nBalance ('--balance' command line parameter) could be used to forward server socket receptions through"; - result += "\n entity servers by mean a round-robin algorithm. Both diameter server socket and entity targets should"; - result += "\n have been configured, that is to say: launcher acts as client and server. If no balance is used, an"; - result += "\n standard delivery is performed: first primary entity server, secondary when fails, etc."; - result += "\n"; - result += "\n--------------------------------------------------------------------------- Processing types (log tags)"; - result += "\n"; - result += "\nUsed as log file extensions (when '--splitLog' is provided on command line) and context preffixes on log"; - result += "\n details when unique log file is dumped:"; - result += "\n"; - result += "\n [sent2e/send2eError] Send to entity (success/error)"; - result += "\n [sent2c/send2cError] Send to client (success/error)"; - result += "\n [fwd2e/fwd2eError] Forward to entity a reception from client (success/error)"; - result += "\n [fwd2c/fwd2cError] Forward to client a reception from entity (success/error)"; - result += "\n [recvfc] Reception from client"; - result += "\n [recvfe] Reception from entity"; - result += "\n [req2c-expired] A request sent to client has been expired"; - result += "\n [req2e-expired] A request sent to entity has been expired"; - result += "\n [recvfc-ans-unknown] Reception from client of an unknown answer (probably former [req2c-expired]"; - result += "\n has been logged)"; - result += "\n [recvfe-ans-unknown] Reception from entity of an unknown answer (probably former [req2e-expired]"; - result += "\n has been logged)"; - result += "\n [retry] Request retransmission"; - result += "\n"; - result += "\n------------------------------------------------------------------------------------------- Burst tests"; - result += "\n"; - result += "\nIn order to simplify user experience, burst category operations are only allowed in single host node"; - result += "\n configuration. Indeed, you could send messages with unmatched Origin-Host, and no warning is shown."; - result += "\nAll the operations are performed through the unique host: if you need to use more interfaces, you may"; - result += "\n launch different ADML instances. Is nonsense to allow burst in a multi-host configured ADML, because"; - result += "\n this feature is not able to coordinate the messages."; - result += "\n"; - result += "\nburst|[|parameter] Used for performance testing, we first program diameter requests"; - result += "\n messages in order to launch them from client side to the configured"; - result += "\n diameter entity. We could start the burst with an initial load"; - result += "\n (non-asynchronous sending), after this, a new request will be sent"; - result += "\n per answer received or expired context. There are 10 actions: clear,"; - result += "\n load, start, push, pop, stop, repeat, send, goto and look."; - result += "\n"; - result += "\n burst|clear Clears all loaded burst messages."; - result += "\n burst|load| Loads the next diameter message into launcher burst."; - result += "\n burst|start| Starts (or restarts if already in progress) the message sending with"; - result += "\n a certain initial load."; - result += "\n burst|push| Sends specific non-aynchronous load."; - result += "\n burst|pop| Skip send burst messages in order to reduce over-the-air requests."; - result += "\n Popping all OTA requests implies burst stop because no more answer"; - result += "\n will arrive to the process. Burst output file (--burstLog command"; - result += "\n line parameter) shows popped messages with crosses (x). Each cross"; - result += "\n represents one received answer for which no new request is sent."; - result += "\n burst|stop Stops the burst cycle. You can resume pushing 1 load amount."; - result += "\n burst|repeat[|[yes]|no] Restarts the burst launch when finish. If initial load or push load"; - result += "\n amount is greater than burst list size, they will be limited when"; - result += "\n the list is processed except when repeat mode is enabled."; - result += "\n burst|send| Sends messages from burst list. The main difference with start/push"; - result += "\n operations is that burst won't be awaken. Externally we could control"; - result += "\n sending time (no request will be sent for answers)."; - result += "\n burst|goto| Updates current burst pointer position."; - result += "\n burst|look[|order] Show programmed burst message for order provided, current when missing."; - result += "\n"; - result += "\n-------------------------------------------------------------------------------------- Advanced testing"; - result += "\n"; - result += "\n Burst mode only allows single interface interaction. For multiple interface"; - result += "\n (origin-host) coordination, you could use the advanced test cases programming:"; - result += "\n"; - result += "\n"; - result += "\n test||[|parameters]"; - result += "\n"; - result += "\n Adds a new step to the test case with provided identifier. If provided identifier"; - result += "\n is not registered yet, a new test case will be created with that value and the"; - result += "\n step will be added as the first. For a specific 'id', the steps are stored in"; - result += "\n order as they are programmed. Check possible runtime exceptions when adding a"; - result += "\n new step because those which fail, will be ignored/skipped during test case"; - result += "\n programming giving an incomplete sequence invalid for the testing purpose."; - result += "\n"; - result += "\n : integer number, normally monotonically increased for each test case. Some external"; - result += "\n script/procedure shall clone a test case template in order to build a collection"; - result += "\n of independent and coherent test cases (normally same type) with different context"; - result += "\n values (Session-Id, Subscriber-Id, etc.)."; - result += "\n"; - result += "\n : commands to be executed for the test id provided. Each command programmed"; - result += "\n constitutes a test case 'step', numbered from 1 to N, with an exception for"; - result += "\n 'description' which is used to describe the test case:"; - result += "\n"; - result += "\n description| Sets a test case description. Test cases by default are"; - result += "\n constructed with description 'Testcase_'."; - result += "\n"; - result += "\n ip-limit[|amount] In-progress limit of test cases controlled from this test."; - result += "\n No new test cases will be launched over this value (test"; - result += "\n manager tick work will be ignored). Zero-value is equivalent"; - result += "\n to stop the clock tick, -1 is used to specify 'no limit' which"; - result += "\n is the default. For missing amount, value of 1 is applied."; - result += "\n"; - result += "\n timeout| Sets an asynchronous timer to restrict the maximum timeout"; - result += "\n until last test step. Normally, this command is invoked"; - result += "\n in the first step, anyway it measures the time from the"; - result += "\n execution point whatever it is. The expiration will abort"; - result += "\n the test if still running. One or more timeouts could be"; - result += "\n programmed (not usual), but the more restrict will apply."; - result += "\n It is highly recommended to program a initial timeout step,"; - result += "\n or the test case could be eternally in-progress."; - result += "\n"; - result += "\n sendxml2e|[|]"; - result += "\n Sends xml source file (pathfile) to entity (it would be a"; - result += "\n 'forward' event if it came through local server endpoint)."; - result += "\n Take into account that the xml message is encoded just on"; - result += "\n call. The xml file is not longer needed neither interpreted"; - result += "\n in case of modification, after calling this command."; - result += "\n The step number should be provided for answers to indicate"; - result += "\n the 'wait for request' corresponding step. If you miss this"; - result += "\n reference, the sequence information (hop-by-hop, end-to-end)"; - result += "\n will be sent as they are in the answer xml message (realize"; - result += "\n the difficulty of predicting these information). Be sure to"; - result += "\n refer to a 'wait for request' step. Conditions like 'regexp'"; - result += "\n (as we will see later) are not verified."; - result += "\n In the case of requests, the step number is used to force the"; - result += "\n copy of Session-Id value from the referred step."; - result += "\n"; - result += "\n sendxml2c|[|]"; - result += "\n Sends xml source file (pathfile) to client (it would be a"; - result += "\n 'forward' event if it came through remote server endpoint)."; - result += "\n Same commented for 'sendxml2e' regarding the step number."; - result += "\n"; - result += "\n delay| Blocking step until the time lapse expires. Useful to give "; - result += "\n some cadence control and time schedule for a specific case."; - result += "\n A value of 0 could be used as a dummy step."; - result += "\n"; - result += "\n sh-command|