int swssloglevel()

in common/loglevel.cpp [92:209]


int swssloglevel(int argc, char** argv)
{
    int opt;
    bool applyToAll = false, print = false, default_loglevel_opt = false;
    std::string prefix = "", component, loglevel;
    auto exitWithUsage = std::bind(usage, argv[0], std::placeholders::_1, std::placeholders::_2);

    while ( (opt = getopt (argc, argv, "c:l:sapdh")) != -1)
    {
        switch(opt)
        {
            case 'c':
                component = optarg;
                break;
            case 'l':
                loglevel = optarg;
                break;
            case 's':
                prefix = "SAI_API_";
                break;
            case 'a':
                applyToAll = true;
                break;
            case 'p':
                print = true;
                break;
            case 'd':
                default_loglevel_opt = true;
                break;
            case 'h':
                exitWithUsage(EXIT_SUCCESS, "");
                break;
            default:
                exitWithUsage(EXIT_FAILURE, "Invalid option");
        }
    }

    DBConnector config_db("CONFIG_DB", 0);
    swss::Table logger_tbl(&config_db, CFG_LOGGER_TABLE_NAME);
    std::vector<std::string> keys;
    logger_tbl.getKeys(keys);

    if (print)
    {
        int errorCount = 0;

        if (argc != 2)
        {
            exitWithUsage(EXIT_FAILURE, "-p option does not accept other options");
        }

        std::sort(keys.begin(), keys.end());
        for (const auto& key : keys)
        {
            std::string level;
            if (!(logger_tbl.hget(key, DAEMON_LOGLEVEL, level)))
            {
                std::cerr << std::left << std::setw(30) << key << "Unknown log level" << std::endl;
                errorCount ++;
            }
            else
            {
                std::cout << std::left << std::setw(30) << key << level << std::endl;
            }
        }

        if (errorCount > 0)
            return (EXIT_FAILURE);

        return (EXIT_SUCCESS);
    }

    if(default_loglevel_opt)
    {
        std::vector<std::string> sai_keys = get_sai_keys(keys);
        std::vector<std::string> no_sai_keys = get_no_sai_keys(keys);
        setAllLoglevel(logger_tbl,no_sai_keys, std::string(DEFAULT_LOGLEVEL));
        setAllLoglevel(logger_tbl,sai_keys, std::string(SAI_DEFAULT_LOGLEVEL));
        return (EXIT_SUCCESS);
    }
    if ((prefix == "SAI_API_") && !validateSaiLoglevel(loglevel))
    {
        exitWithUsage(EXIT_FAILURE, "Invalid SAI loglevel value");
    }
    else if ((prefix == "") && (Logger::priorityStringMap.find(loglevel) == Logger::priorityStringMap.end()))
    {
        exitWithUsage(EXIT_FAILURE, "Invalid loglevel value");
    }

    if (applyToAll)
    {
        if (component != "")
        {
            exitWithUsage(EXIT_FAILURE, "Invalid options provided with -a");
        }

        if (prefix == "SAI_API_")
        {
            keys.erase(std::remove_if(keys.begin(), keys.end(), filterSaiKeys), keys.end());
        }
        else
        {
            keys.erase(std::remove_if(keys.begin(), keys.end(), filterOutSaiKeys), keys.end());
        }

        setAllLoglevel(logger_tbl, keys, loglevel);
        exit(EXIT_SUCCESS);
    }

    component = prefix + component;
    if (std::find(std::begin(keys), std::end(keys), component) == keys.end())
    {
        exitWithUsage(EXIT_FAILURE, "Component not present in DB");
    }
    setLoglevel(logger_tbl, component, loglevel);

    return EXIT_SUCCESS;
}