syncd/CommandLineOptionsParser.cpp (171 lines of code) (raw):
#include "CommandLineOptionsParser.h"
#include "meta/sai_serialize.h"
#include "swss/logger.h"
#include <getopt.h>
#include <iostream>
using namespace syncd;
std::shared_ptr<CommandLineOptions> CommandLineOptionsParser::parseCommandLine(
_In_ int argc,
_In_ char **argv)
{
SWSS_LOG_ENTER();
auto options = std::make_shared<CommandLineOptions>();
#ifdef SAITHRIFT
const char* const optstring = "dp:t:g:x:b:B:w:uSUCsz:lrm:h";
#else
const char* const optstring = "dp:t:g:x:b:B:w:uSUCsz:lh";
#endif // SAITHRIFT
while (true)
{
static struct option long_options[] =
{
{ "diag", no_argument, 0, 'd' },
{ "profile", required_argument, 0, 'p' },
{ "startType", required_argument, 0, 't' },
{ "useTempView", no_argument, 0, 'u' },
{ "disableExitSleep", no_argument, 0, 'S' },
{ "enableUnittests", no_argument, 0, 'U' },
{ "enableConsistencyCheck", no_argument, 0, 'C' },
{ "syncMode", no_argument, 0, 's' },
{ "redisCommunicationMode", required_argument, 0, 'z' },
{ "enableSaiBulkSupport", no_argument, 0, 'l' },
{ "globalContext", required_argument, 0, 'g' },
{ "contextContig", required_argument, 0, 'x' },
{ "breakConfig", required_argument, 0, 'b' },
{ "watchdogWarnTimeSpan", optional_argument, 0, 'w' },
{ "supportingBulkCounters", required_argument, 0, 'B' },
#ifdef SAITHRIFT
{ "rpcserver", no_argument, 0, 'r' },
{ "portmap", required_argument, 0, 'm' },
#endif // SAITHRIFT
{ "help", no_argument, 0, 'h' },
{ 0, 0, 0, 0 }
};
int option_index = 0;
int c = getopt_long(argc, argv, optstring, long_options, &option_index);
if (c == -1)
{
break;
}
switch (c)
{
case 'd':
options->m_enableDiagShell = true;
break;
case 'p':
options->m_profileMapFile = std::string(optarg);
break;
case 't':
options->m_startType = CommandLineOptions::startTypeStringToStartType(optarg);
if (options->m_startType == SAI_START_TYPE_UNKNOWN)
{
SWSS_LOG_ERROR("unknown start type '%s'", optarg);
exit(EXIT_FAILURE);
}
break;
case 'u':
options->m_enableTempView = true;
break;
case 'S':
options->m_disableExitSleep = true;
break;
case 'U':
options->m_enableUnittests = true;
break;
case 'C':
options->m_enableConsistencyCheck = true;
break;
case 's':
SWSS_LOG_WARN("param -s is depreacated, use -z");
options->m_enableSyncMode = true;
break;
case 'z':
sai_deserialize_redis_communication_mode(optarg, options->m_redisCommunicationMode);
break;
case 'l':
options->m_enableSaiBulkSupport = true;
break;
case 'g':
options->m_globalContext = (uint32_t)std::stoul(optarg);
break;
case 'x':
options->m_contextConfig = std::string(optarg);
break;
case 'b':
options->m_breakConfig = std::string(optarg);
break;
case 'w':
options->m_watchdogWarnTimeSpan = (int64_t)std::stoll(optarg);
break;
#ifdef SAITHRIFT
case 'r':
options->m_runRPCServer = true;
break;
case 'm':
options->m_portMapFile = std::string(optarg);
break;
#endif // SAITHRIFT
case 'B':
options->m_supportingBulkCounterGroups = std::string(optarg);
break;
case 'h':
printUsage();
exit(EXIT_SUCCESS);
case '?':
SWSS_LOG_WARN("unknown option %c", optopt);
printUsage();
exit(EXIT_FAILURE);
default:
SWSS_LOG_ERROR("getopt_long failure");
exit(EXIT_FAILURE);
}
}
return options;
}
void CommandLineOptionsParser::printUsage()
{
SWSS_LOG_ENTER();
#ifdef SAITHRIFT
std::cout << "Usage: syncd [-d] [-p profile] [-t type] [-u] [-S] [-U] [-C] [-s] [-z mode] [-l] [-g idx] [-x contextConfig] [-b breakConfig] [-B supportingBulkCounters] [-r] [-m portmap] [-h]" << std::endl;
#else
std::cout << "Usage: syncd [-d] [-p profile] [-t type] [-u] [-S] [-U] [-C] [-s] [-z mode] [-l] [-g idx] [-x contextConfig] [-b breakConfig] [-B supportingBulkCounters] [-h]" << std::endl;
#endif // SAITHRIFT
std::cout << " -d --diag" << std::endl;
std::cout << " Enable diagnostic shell" << std::endl;
std::cout << " -p --profile profile" << std::endl;
std::cout << " Provide profile map file" << std::endl;
std::cout << " -t --startType type" << std::endl;
std::cout << " Specify start type (cold|warm|fast|fastfast|express)" << std::endl;
std::cout << " -u --useTempView" << std::endl;
std::cout << " Use temporary view between init and apply" << std::endl;
std::cout << " -S --disableExitSleep" << std::endl;
std::cout << " Disable sleep when syncd crashes" << std::endl;
std::cout << " -U --enableUnittests" << std::endl;
std::cout << " Metadata enable unittests" << std::endl;
std::cout << " -C --enableConsistencyCheck" << std::endl;
std::cout << " Enable consisteny check DB vs ASIC after comparison logic" << std::endl;
std::cout << " -s --syncMode" << std::endl;
std::cout << " Enable synchronous mode (depreacated, use -z)" << std::endl;
std::cout << " -z --redisCommunicationMode" << std::endl;
std::cout << " Redis communication mode (redis_async|redis_sync|zmq_sync), default: redis_async" << std::endl;
std::cout << " -l --enableBulk" << std::endl;
std::cout << " Enable SAI Bulk support" << std::endl;
std::cout << " -g --globalContext" << std::endl;
std::cout << " Global context index to load from context config file" << std::endl;
std::cout << " -x --contextConfig" << std::endl;
std::cout << " Context configuration file" << std::endl;
std::cout << " -b --breakConfig" << std::endl;
std::cout << " Comparison logic 'break before make' configuration file" << std::endl;
std::cout << " -w --watchdogWarnTimeSpan" << std::endl;
std::cout << " Watchdog time span (in microseconds) to watch for execution" << std::endl;
std::cout << " -B --supportingBulkCounters" << std::endl;
std::cout << " Counter groups those support bulk polling" << std::endl;
#ifdef SAITHRIFT
std::cout << " -r --rpcserver" << std::endl;
std::cout << " Enable rpcserver" << std::endl;
std::cout << " -m --portmap portmap" << std::endl;
std::cout << " Specify port map file" << std::endl;
#endif // SAITHRIFT
std::cout << " -h --help" << std::endl;
std::cout << " Print out this message" << std::endl;
}