simple_parser.cc 4.2 KB
Newer Older
1
// Copyright (C) 2017-2019 Internet Systems Consortium, Inc. ("ISC")
2 3 4 5 6
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.

7 8
#include <config.h>

9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
#include <agent/simple_parser.h>
#include <cc/data.h>
#include <cc/dhcp_config_error.h>
#include <hooks/hooks_parser.h>
#include <boost/foreach.hpp>

using namespace isc::data;

namespace isc {
namespace agent {
/// @brief This sets of arrays define the default values in various scopes
///        of the Control Agent Configuration.
///
/// Each of those is documented in @file agent/simple_parser.cc. This
/// is different than most other comments in Kea code. The reason
/// for placing those in .cc rather than .h file is that it
/// is expected to be one centralized place to look at for
/// the default values. This is expected to be looked at also by
/// people who are not skilled in C or C++, so they may be
/// confused with the differences between declaration and definition.
/// As such, there's one file to look at that hopefully is readable
/// without any C or C++ skills.
///
/// @{

/// @brief This table defines default values for global options.
///
/// These are global Control Agent parameters.
const SimpleDefaults AgentSimpleParser::AGENT_DEFAULTS = {
38
    { "http-host",    Element::string,  "127.0.0.1"},
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
    { "http-port",    Element::integer,  "8000"}
};

/// @brief This table defines default values for control sockets.
///
const SimpleDefaults AgentSimpleParser::SOCKET_DEFAULTS = {
    { "socket-type",  Element::string,  "unix"}
};

/// @}

/// ---------------------------------------------------------------------------
/// --- end of default values -------------------------------------------------
/// ---------------------------------------------------------------------------

54
size_t AgentSimpleParser::setAllDefaults(const isc::data::ElementPtr& global) {
55 56 57 58 59 60 61 62
    size_t cnt = 0;

    // Set global defaults first.
    cnt = setDefaults(global, AGENT_DEFAULTS);

    // Now set the defaults for control-sockets, if any.
    ConstElementPtr sockets = global->get("control-sockets");
    if (sockets) {
63
        ElementPtr d2 = boost::const_pointer_cast<Element>(sockets->get("d2"));
64 65 66 67
        if (d2) {
            cnt += SimpleParser::setDefaults(d2, SOCKET_DEFAULTS);
        }

68
        ElementPtr d4 = boost::const_pointer_cast<Element>(sockets->get("dhcp4"));
69 70 71 72
        if (d4) {
            cnt += SimpleParser::setDefaults(d4, SOCKET_DEFAULTS);
        }

73
        ElementPtr d6 = boost::const_pointer_cast<Element>(sockets->get("dhcp6"));
74
        if (d6) {
75 76 77 78 79 80 81 82
            cnt += SimpleParser::setDefaults(d6, SOCKET_DEFAULTS);
        }
    }

    return (cnt);
}

void
83 84
AgentSimpleParser::parse(const CtrlAgentCfgContextPtr& ctx,
                         const isc::data::ConstElementPtr& config,
85 86
                         bool check_only) {

87
    // Let's get the HTTP parameters first.
88 89
    ctx->setHttpHost(SimpleParser::getString(config, "http-host"));
    ctx->setHttpPort(SimpleParser::getIntType<uint16_t>(config, "http-port"));
90

91
    // Control sockets are second.
92
    ConstElementPtr ctrl_sockets = config->get("control-sockets");
93
    if (ctrl_sockets) {
94 95 96
        auto sockets_map = ctrl_sockets->mapValue();
        for (auto cs = sockets_map.cbegin(); cs != sockets_map.cend(); ++cs) {
            ctx->setControlSocketInfo(cs->second, cs->first);
97
        }
98 99
    }

100 101 102 103 104 105
    // User context can be done at anytime.
    ConstElementPtr user_context = config->get("user-context");
    if (user_context) {
        ctx->setContext(user_context);
    }

106
    // Finally, let's get the hook libs!
107

108 109
    using namespace isc::hooks;
    HooksConfig& libraries = ctx->getHooksConfig();
110 111
    ConstElementPtr hooks = config->get("hooks-libraries");
    if (hooks) {
112 113 114
        HooksLibrariesParser hooks_parser;
        hooks_parser.parse(libraries, hooks);
        libraries.verifyLibraries(hooks->getPosition());
115 116 117 118 119 120
    }

    if (!check_only) {
        // This occurs last as if it succeeds, there is no easy way
        // revert it.  As a result, the failure to commit a subsequent
        // change causes problems when trying to roll back.
121
        libraries.loadLibraries();
122 123 124 125 126
    }
}

};
};