Kea 1.5.0
shared_network_parser.cc
Go to the documentation of this file.
1// Copyright (C) 2017-2018 Internet Systems Consortium, Inc. ("ISC")
2//
3// This Source Code Form is subject to the terms of the Mozilla Public
4// License, v. 2.0. If a copy of the MPL was not distributed with this
5// file, You can obtain one at http://mozilla.org/MPL/2.0/.
6
7#ifndef SHARED_NETWORK_PARSER_H
8#define SHARED_NETWORK_PARSER_H
9
10#include <config.h>
11
12#include <cc/data.h>
13#include <dhcpsrv/cfg_option.h>
18#include <boost/pointer_cast.hpp>
19#include <string>
20
21using namespace isc::data;
22
23namespace isc {
24namespace dhcp {
25
28 SharedNetwork4Ptr shared_network;
29 try {
30 // Make sure that the network name has been specified. The name is required
31 // to create a SharedNetwork4 object.
32 std::string name = getString(shared_network_data, "name");
33 shared_network.reset(new SharedNetwork4(name));
34
35 // interface is an optional parameter
36 if (shared_network_data->contains("interface")) {
37 shared_network->setIface(getString(shared_network_data, "interface"));
38 }
39
40 if (shared_network_data->contains("option-data")) {
41 auto json = shared_network_data->get("option-data");
42 // Create parser instance for option-data.
43 CfgOptionPtr cfg_option = shared_network->getCfgOption();
44 OptionDataListParser parser(AF_INET);
45 parser.parse(cfg_option, json);
46 }
47
48 if (shared_network_data->contains("subnet4")) {
49 auto json = shared_network_data->get("subnet4");
50
51 // Create parser instance of subnet4.
53 Subnet4Collection subnets;
54 parser.parse(subnets, json);
55
56 // Add all returned subnets into shared network.
57 for (auto subnet = subnets.cbegin(); subnet != subnets.cend();
58 ++subnet) {
59 shared_network->add(*subnet);
60 }
61 }
62
63 if (shared_network_data->contains("match-client-id")) {
64 shared_network->setMatchClientId(getBoolean(shared_network_data,
65 "match-client-id"));
66 }
67
68 if (shared_network_data->contains("authoritative")) {
69 shared_network->setAuthoritative(getBoolean(shared_network_data,
70 "authoritative"));
71 }
72
73 if (shared_network_data->contains("client-class")) {
74 std::string client_class = getString(shared_network_data, "client-class");
75 if (!client_class.empty()) {
76 shared_network->allowClientClass(client_class);
77 }
78 }
79
80 ConstElementPtr user_context = shared_network_data->get("user-context");
81 if (user_context) {
82 shared_network->setContext(user_context);
83 }
84
85 if (shared_network_data->contains("require-client-classes")) {
86 const std::vector<data::ElementPtr>& class_list =
87 shared_network_data->get("require-client-classes")->listValue();
88 for (auto cclass = class_list.cbegin();
89 cclass != class_list.cend(); ++cclass) {
90 if (((*cclass)->getType() != Element::string) ||
91 (*cclass)->stringValue().empty()) {
92 isc_throw(DhcpConfigError, "invalid class name ("
93 << (*cclass)->getPosition() << ")");
94 }
95 shared_network->requireClientClass((*cclass)->stringValue());
96 }
97 }
98
99 if (shared_network_data->contains("relay")) {
100 auto relay_parms = shared_network_data->get("relay");
101 if (relay_parms) {
104 parser.parse(relay_info, relay_parms);
105 shared_network->setRelayInfo(*relay_info);
106 }
107 }
108 } catch (const DhcpConfigError&) {
109 // Position was already added
110 throw;
111 } catch (const std::exception& ex) {
112 isc_throw(DhcpConfigError, ex.what() << " ("
113 << shared_network_data->getPosition() << ")");
114 }
115
116 return (shared_network);
117}
118
121 SharedNetwork6Ptr shared_network;
122 std::string name;
123 try {
124 // Make sure that the network name has been specified. The name is required
125 // to create a SharedNetwork6 object.
126 std::string name = getString(shared_network_data, "name");
127 shared_network.reset(new SharedNetwork6(name));
128
129 // Interface is an optional parameter
130 if (shared_network_data->contains("interface")) {
131 shared_network->setIface(getString(shared_network_data, "interface"));
132 }
133
134 if (shared_network_data->contains("option-data")) {
135 auto json = shared_network_data->get("option-data");
136 // Create parser instance for option-data.
137 CfgOptionPtr cfg_option = shared_network->getCfgOption();
138 OptionDataListParser parser(AF_INET6);
139 parser.parse(cfg_option, json);
140 }
141
142 if (shared_network_data->contains("client-class")) {
143 std::string client_class = getString(shared_network_data, "client-class");
144 if (!client_class.empty()) {
145 shared_network->allowClientClass(client_class);
146 }
147 }
148
149 ConstElementPtr user_context = shared_network_data->get("user-context");
150 if (user_context) {
151 shared_network->setContext(user_context);
152 }
153
154 if (shared_network_data->contains("require-client-classes")) {
155 const std::vector<data::ElementPtr>& class_list =
156 shared_network_data->get("require-client-classes")->listValue();
157 for (auto cclass = class_list.cbegin();
158 cclass != class_list.cend(); ++cclass) {
159 if (((*cclass)->getType() != Element::string) ||
160 (*cclass)->stringValue().empty()) {
161 isc_throw(DhcpConfigError, "invalid class name ("
162 << (*cclass)->getPosition() << ")");
163 }
164 shared_network->requireClientClass((*cclass)->stringValue());
165 }
166 }
167
168 if (shared_network_data->contains("subnet6")) {
169 auto json = shared_network_data->get("subnet6");
170
171 // Create parser instance of subnet6.
173 Subnet6Collection subnets;
174 parser.parse(subnets, json);
175
176 // Add all returned subnets into shared network.
177 for (auto subnet = subnets.cbegin(); subnet != subnets.cend();
178 ++subnet) {
179 shared_network->add(*subnet);
180 }
181 }
182
183 if (shared_network_data->contains("relay")) {
184 auto relay_parms = shared_network_data->get("relay");
185 if (relay_parms) {
188 parser.parse(relay_info, relay_parms);
189 shared_network->setRelayInfo(*relay_info);
190 }
191 }
192 } catch (const std::exception& ex) {
193 isc_throw(DhcpConfigError, ex.what() << " ("
194 << shared_network_data->getPosition() << ")");
195 }
196
197 return (shared_network);
198}
199
200} // end of namespace isc::dhcp
201} // end of namespace isc
202
203#endif // SHARED_NETWORK_PARSER_H
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
static std::string getString(isc::data::ConstElementPtr scope, const std::string &name)
Returns a string parameter from a scope.
static bool getBoolean(isc::data::ConstElementPtr scope, const std::string &name)
Returns a boolean parameter from a scope.
To be removed. Please use ConfigError instead.
Holds optional information about relay.
Definition: network.h:59
boost::shared_ptr< Network::RelayInfo > RelayInfoPtr
Pointer to the RelayInfo structure.
Definition: network.h:116
Parser for option data values within a subnet.
void parse(const CfgOptionPtr &cfg, isc::data::ConstElementPtr option_data_list)
Parses a list of options, instantiates them and stores in cfg.
parser for additional relay information
Definition: dhcp_parsers.h:389
void parse(const isc::dhcp::Network::RelayInfoPtr &relay_info, isc::data::ConstElementPtr relay_elem)
parses the actual relay parameters
SharedNetwork4Ptr parse(const data::ConstElementPtr &shared_network_data)
Parses shared configuration information for IPv4 shared network.
Shared network holding IPv4 subnets.
SharedNetwork6Ptr parse(const data::ConstElementPtr &shared_network_data)
Parses shared configuration information for IPv6 shared network.
Shared network holding IPv6 subnets.
this class parses list of DHCP4 subnets
Definition: dhcp_parsers.h:561
size_t parse(SrvConfigPtr cfg, data::ConstElementPtr subnets_list)
parses contents of the list
this class parses a list of DHCP6 subnets
Definition: dhcp_parsers.h:754
size_t parse(SrvConfigPtr cfg, data::ConstElementPtr subnets_list)
parses contents of the list
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
boost::shared_ptr< const Element > ConstElementPtr
Definition: data.h:23
boost::multi_index_container< Subnet6Ptr, boost::multi_index::indexed_by< boost::multi_index::random_access< boost::multi_index::tag< SubnetRandomAccessIndexTag > >, boost::multi_index::ordered_unique< boost::multi_index::tag< SubnetSubnetIdIndexTag >, boost::multi_index::const_mem_fun< Subnet, SubnetID, &Subnet::getID > >, boost::multi_index::ordered_unique< boost::multi_index::tag< SubnetPrefixIndexTag >, boost::multi_index::const_mem_fun< Subnet, std::string, &Subnet::toText > > > > Subnet6Collection
A collection of Subnet6 objects.
Definition: subnet.h:843
boost::shared_ptr< CfgOption > CfgOptionPtr
Non-const pointer.
Definition: cfg_option.h:497
boost::shared_ptr< SharedNetwork6 > SharedNetwork6Ptr
Pointer to SharedNetwork6 object.
boost::multi_index_container< Subnet4Ptr, boost::multi_index::indexed_by< boost::multi_index::random_access< boost::multi_index::tag< SubnetRandomAccessIndexTag > >, boost::multi_index::ordered_unique< boost::multi_index::tag< SubnetSubnetIdIndexTag >, boost::multi_index::const_mem_fun< Subnet, SubnetID, &Subnet::getID > >, boost::multi_index::ordered_unique< boost::multi_index::tag< SubnetPrefixIndexTag >, boost::multi_index::const_mem_fun< Subnet, std::string, &Subnet::toText > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< SubnetServerIdIndexTag >, boost::multi_index::const_mem_fun< Network4, asiolink::IOAddress, &Network4::getServerId > > > > Subnet4Collection
A collection of Subnet4 objects.
Definition: subnet.h:798
boost::shared_ptr< SharedNetwork4 > SharedNetwork4Ptr
Pointer to SharedNetwork4 object.
Defines the logger used by the top-level component of kea-dhcp-ddns.