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>
17 #include <dhcpsrv/shared_network.h>
18 #include <boost/pointer_cast.hpp>
19 #include <string>
20 
21 using namespace isc::data;
22 
23 namespace isc {
24 namespace dhcp {
25 
27 SharedNetwork4Parser::parse(const data::ConstElementPtr& shared_network_data) {
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) {
102  RelayInfoParser parser(Option::V4);
103  Network::RelayInfoPtr relay_info(new Network::RelayInfo());
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 
120 SharedNetwork6Parser::parse(const data::ConstElementPtr& shared_network_data) {
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) {
186  RelayInfoParser parser(Option::V6);
187  Network::RelayInfoPtr relay_info(new Network::RelayInfo());
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
void parse(const CfgOptionPtr &cfg, isc::data::ConstElementPtr option_data_list)
Parses a list of options, instantiates them and stores in cfg.
boost::shared_ptr< CfgOption > CfgOptionPtr
Non-const pointer.
Definition: cfg_option.h:497
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
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< Network::RelayInfo > RelayInfoPtr
Pointer to the RelayInfo structure.
Definition: network.h:116
this class parses list of DHCP4 subnets
Definition: dhcp_parsers.h:561
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
Shared network holding IPv4 subnets.
Holds optional information about relay.
Definition: network.h:59
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
parser for additional relay information
Definition: dhcp_parsers.h:389
To be removed. Please use ConfigError instead.
boost::shared_ptr< const Element > ConstElementPtr
Definition: data.h:23
Parser for option data values within a subnet.
boost::shared_ptr< SharedNetwork6 > SharedNetwork6Ptr
Pointer to SharedNetwork6 object.
size_t parse(SrvConfigPtr cfg, data::ConstElementPtr subnets_list)
parses contents of the list
boost::shared_ptr< SharedNetwork4 > SharedNetwork4Ptr
Pointer to SharedNetwork4 object.
Defines the logger used by the top-level component of kea-dhcp-ddns.
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
void parse(const isc::dhcp::Network::RelayInfoPtr &relay_info, isc::data::ConstElementPtr relay_elem)
parses the actual relay parameters
Shared network holding IPv6 subnets.