Commit 53ba9f81 authored by Marcin Siodelski's avatar Marcin Siodelski
Browse files

[master] Merge branch 'trac5108'

parents 57a13270 dce538b3
......@@ -93,17 +93,6 @@
}</screen>
</para>
<warning>
<simpara>
In the Kea 1.2 release the Control Agent configuration can't be
specified within the same configuration file as DHCPv4, DHCPv6 and D2
configuration. The default configuration file for the CA is installed
in the <filename>etc/kea/kea-ca.conf</filename>. In the Kea 1.2 final
release the CA configuration will be merged into the default
<filename>etc/kea/kea.conf.</filename>
</simpara>
</warning>
<para>
The <command>http-host</command> and <command>http-port</command>
specify an IP address and port to which HTTP service will be bound.
......@@ -284,16 +273,8 @@ http {
<title>Control Agent Limitations</title>
<para>
Control Agent is a new component, first released in Kea 1.2. In
this release it comes with two notable limitations:
this release it comes with one notable limitation:
<itemizedlist>
<listitem>
<simpara>
CA configuration must be specified in a separate configuration file
from the configurations of other components. The default confirguation
file for CA is located in <filename>etc/kea/kea-ca.conf</filename>.
</simpara>
</listitem>
<listitem>
<simpara>
keactrl hasn't been updated to manage the Control Agent (start, stop
......@@ -311,7 +292,7 @@ http {
The CA is started by running its binary and specifying the configuration file
it should use. For example:
<screen>
$ ./kea-ctrl-agent -c /usr/local/etc/kea/kea-ca.conf
$ ./kea-ctrl-agent -c /usr/local/etc/kea/kea.conf
</screen>
</para>
</section>
......
......@@ -11,9 +11,10 @@
<title>Overview</title>
<para>keactrl is a shell script which controls the startup, shutdown
and reconfiguration of the Kea servers (<command>kea-dhcp4</command>,
<command>kea-dhcp6</command> and <command>kea-dhcp-ddns</command>). It
also provides the means for checking the current status of the servers
and determining the configuration files in use.
<command>kea-dhcp6</command>, <command>kea-dhcp-ddns</command> and
<command>kea-ctrl-agent</command>). It also provides the means for
checking the current status of the servers and determining the
configuration files in use.
</para>
</section>
......@@ -66,19 +67,20 @@ keactrl &lt;command&gt; [-c keactrl-config-file] [-s server[,server,..]]
<screen>
# This is a configuration file for keactrl script which controls
# the startup, shutdown, reconfiguration and gathering the status
# of the Kea servers.
# of the Kea's processes.
# prefix holds the location where the Kea is installed.
prefix=/usr/local
prefix=@prefix@
# Location of Kea configuration file.
kea_config_file=${prefix}/etc/kea/kea.conf
kea_config_file=@sysconfdir@/@PACKAGE@/kea.conf
# Location of Kea binaries.
exec_prefix=${prefix}
dhcp4_srv=${exec_prefix}/sbin/kea/kea-dhcp4
dhcp6_srv=${exec_prefix}/sbin/kea/kea-dhcp6
dhcp_ddns_srv=${exec_prefix}/sbin/kea/kea-dhcp-ddns
exec_prefix=@exec_prefix@
dhcp4_srv=@sbindir@/kea-dhcp4
dhcp6_srv=@sbindir@/kea-dhcp6
dhcp_ddns_srv=@sbindir@/kea-dhcp-ddns
ctrl_agent_srv=@sbindir@/kea-ctrl-agent
# Start DHCPv4 server?
dhcp4=yes
......@@ -87,7 +89,10 @@ dhcp4=yes
dhcp6=yes
# Start DHCP DDNS server?
dhcp_ddns=yes
dhcp_ddns=no
# Start Control Agent?
ctrl_agent=yes
# Be verbose?
kea_verbose=no
......@@ -95,12 +100,13 @@ kea_verbose=no
</para>
<para>
The <parameter>dhcp4</parameter>, <parameter>dhcp6</parameter> and
<parameter>dhcp_ddns</parameter> parameters set to "yes" configure
<command>keactrl</command> to manage (start, reconfigure) all servers,
i.e. <command>kea-dhcp4</command>, <command>kea-dhcp6</command> and
<command>kea-dhcp-ddns</command>. When any of these parameters is set to
"no" the <command>keactrl</command> will ignore
The <parameter>dhcp4</parameter>, <parameter>dhcp6</parameter>,
<parameter>dhcp_ddns</parameter> and <parameter>ctrl_agent</parameter>
parameters set to "yes" configure <command>keactrl</command> to manage
(start, reconfigure) all servers, i.e. <command>kea-dhcp4</command>,
<command>kea-dhcp6</command>, <command>kea-dhcp-ddns</command> and
<command>kea-ctrl-agent</command>. When any of these parameters is set
to "no" the <command>keactrl</command> will ignore
the corresponding server when starting or reconfiguring Kea.
</para>
......@@ -110,8 +116,8 @@ kea_verbose=no
should work for most installations. If the default
location needs to be altered for any reason, the paths
specified with the <parameter>dhcp4_srv</parameter>,
<parameter>dhcp6_srv</parameter> and <parameter>dhcp_ddns_srv</parameter>
parameters should be modified.
<parameter>dhcp6_srv</parameter>, <parameter>dhcp_ddns_srv</parameter>
and <parameter>ctrl_agent_srv</parameter> parameters should be modified.
</para>
<para>
......@@ -165,6 +171,7 @@ kea_verbose=no
INFO/keactrl: Starting kea-dhcp4 -c /usr/local/etc/kea/kea.conf -d
INFO/keactrl: Starting kea-dhcp6 -c /usr/local/etc/kea/kea.conf -d
INFO/keactrl: Starting kea-dhcp-ddns -c /usr/local/etc/kea/kea.conf -d
INFO/keactrl: Starting kea-ctrl-agent -c /usr/local/etc/kea/kea.conf -d
</screen>
</para>
......@@ -177,6 +184,7 @@ INFO/keactrl: Starting kea-dhcp-ddns -c /usr/local/etc/kea/kea.conf -d
INFO/keactrl: kea-dhcp4 appears to be running, see: PID 10918, PID file: /usr/local/var/kea/kea.kea-dhcp4.pid.
INFO/keactrl: kea-dhcp6 appears to be running, see: PID 10924, PID file: /usr/local/var/kea/kea.kea-dhcp6.pid.
INFO/keactrl: kea-dhcp-ddns appears to be running, see: PID 10930, PID file: /usr/local/var/kea/kea.kea-dhcp-ddns.pid.
INFO/keactrl: kea-ctrl-agent appears to be running, see: PID 10931, PID file: /usr/local/var/kea/kea.kea-ctrl-agent.pid.
</screen>
During normal shutdowns these PID files are deleted. They may, however,
be left over as remnants following a system crash. It is possible,
......@@ -193,6 +201,7 @@ INFO/keactrl: kea-dhcp-ddns appears to be running, see: PID 10930, PID file: /us
INFO/keactrl: Stopping kea-dhcp4...
INFO/keactrl: Stopping kea-dhcp6...
INFO/keactrl: Stopping kea-dhcp-ddns...
INFO/keactrl: Stopping kea-ctrl-agent...
</screen>
Note that the <command>stop</command> will attempt to stop all servers
regardless of whether they are "enabled" in the <filename>keactrl.conf</filename>.
......@@ -203,6 +212,7 @@ INFO/keactrl: Stopping kea-dhcp-ddns...
INFO/keactrl: kea-dhcp4 isn't running.
INFO/keactrl: kea-dhcp6 isn't running.
INFO/keactrl: kea-dhcp-ddns isn't running.
INFO/keactrl: kea-ctrl-agent isn't running.
</screen>
</para>
......@@ -219,6 +229,7 @@ INFO/keactrl: kea-dhcp-ddns isn't running.
INFO/keactrl: Reloading kea-dhcp4...
INFO/keactrl: Reloading kea-dhcp6...
INFO/keactrl: Reloading kea-dhcp-ddns...
INFO/keactrl: Reloading kea-ctrl-agent...
</screen>
If any of the servers are not running, an informational message
is displayed as in the <command>reload</command> command output below.
......@@ -227,6 +238,7 @@ INFO/keactrl: Reloading kea-dhcp-ddns...
INFO/keactrl: kea-dhcp4 isn't running.
INFO/keactrl: kea-dhcp6 isn't running.
INFO/keactrl: kea-dhcp-ddns isn't running.
INFO/keactrl: kea-ctrl-agent isn't running.
</screen>
</para>
......@@ -247,6 +259,7 @@ INFO/keactrl: kea-dhcp-ddns isn't running.
DHCPv4 server: active
DHCPv6 server: inactive
DHCP DDNS: active
Control Agent: active
Kea configuration file: /usr/local/etc/kea/kea.conf
keactrl configuration file: /usr/local/etc/kea/keactrl.conf
</screen>
......@@ -261,7 +274,8 @@ keactrl configuration file: /usr/local/etc/kea/keactrl.conf
command is issued. For example, the following
instructs <command>keactrl</command> to stop the
<command>kea-dhcp4</command> and <command>kea-dhcp6</command> servers
and leave the <command>kea-dhcp-ddns</command> server running:
and leave the <command>kea-dhcp-ddns</command> and
<command>kea-ctrl-agent</command> running:
<screen>
<userinput>$ keactrl stop -s dhcp4,dhcp6</userinput>
</screen>
......@@ -270,8 +284,8 @@ keactrl configuration file: /usr/local/etc/kea/keactrl.conf
<para>
Similarly, the following
will only start the <command>kea-dhcp4</command> and
<command>kea-dhcp-ddns</command> servers and not
<command>kea-dhcp6</command>.
<command>kea-dhcp-ddns</command> servers and not:
<command>kea-dhcp6</command>, <command>kea-ctrl-agent</command>.
<screen>
<userinput>$ keactrl start -s dhcp4,dhcp_ddns</userinput>
</screen>
......@@ -302,6 +316,9 @@ keactrl configuration file: /usr/local/etc/kea/keactrl.conf
<listitem><simpara>
<command>dhcp_ddns</command> for <command>kea-dhcp-ddns.</command>
</simpara></listitem>
<listitem><simpara>
<command>ctrl_agent</command> for <command>kea-ctrl-agent.</command>
</simpara></listitem>
<listitem><simpara>
<command>all</command> for all servers (default).
</simpara></listitem>
......
......@@ -117,6 +117,54 @@ TEST(ParserTest, keywordJSON) {
testParser(txt, ParserContext::PARSER_JSON);
}
// This test checks that the DhcpDdns configuration is accepted
// by the parser.
TEST(ParserTest, keywordDhcpDdns) {
string txt =
"{ \"DhcpDdns\" : \n"
"{ \n"
" \"ip-address\": \"192.168.77.1\", \n"
" \"port\": 777 , \n "
" \"ncr-protocol\": \"UDP\", \n"
"\"tsig-keys\": [], \n"
"\"forward-ddns\" : {}, \n"
"\"reverse-ddns\" : {} \n"
"} \n"
"} \n";
testParser(txt, ParserContext::PARSER_AGENT);
}
// This test checks that the Dhcp6 configuration is accepted
// by the parser.
TEST(ParserTest, keywordDhcp6) {
string txt = "{ \"Dhcp6\": { \"interfaces-config\": {"
" \"interfaces\": [ \"type\", \"htype\" ] },\n"
"\"preferred-lifetime\": 3000,\n"
"\"rebind-timer\": 2000, \n"
"\"renew-timer\": 1000, \n"
"\"subnet6\": [ { "
" \"pools\": [ { \"pool\": \"2001:db8:1::/64\" } ],"
" \"subnet\": \"2001:db8:1::/48\", "
" \"interface\": \"test\" } ],\n"
"\"valid-lifetime\": 4000 } }";
testParser(txt, ParserContext::PARSER_AGENT);
}
// This test checks that the Dhcp4 configuration is accepted
// by the parser.
TEST(ParserTest, keywordDhcp4) {
string txt = "{ \"Dhcp4\": { \"interfaces-config\": {"
" \"interfaces\": [ \"type\", \"htype\" ] },\n"
"\"rebind-timer\": 2000, \n"
"\"renew-timer\": 1000, \n"
"\"subnet4\": [ { "
" \"pools\": [ { \"pool\": \"192.0.2.1 - 192.0.2.100\" } ],"
" \"subnet\": \"192.0.2.0/24\", "
" \"interface\": \"test\" } ],\n"
"\"valid-lifetime\": 4000 } }";
testParser(txt, ParserContext::PARSER_AGENT);
}
// This test checks if full config (with top level and Control-agent objects) can
// be parsed with syntactic checking (and as pure JSON).
TEST(ParserTest, keywordAgent) {
......
......@@ -467,6 +467,15 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
}
}
\"Control-agent\" {
switch(driver.ctx_) {
case isc::d2::D2ParserContext::CONFIG:
return isc::d2::D2Parser::make_CONTROL_AGENT(driver.loc_);
default:
return isc::d2::D2Parser::make_STRING("Control-agent", driver.loc_);
}
}
{JSONString} {
/* A string has been matched. It contains the actual string and single quotes.
......
......@@ -51,6 +51,7 @@ using namespace std;
DHCP6 "Dhcp6"
DHCP4 "Dhcp4"
CONTROL_AGENT "Control-agent"
DHCPDDNS "DhcpDdns"
IP_ADDRESS "ip-address"
......@@ -204,8 +205,8 @@ unknown_map_entry: STRING COLON {
};
// This defines the top-level { } that holds Dhcp6, Dhcp4, DhcpDdns or Logging
// objects.
// This defines the top-level { } that holds Control-agent, Dhcp6, Dhcp4,
// DhcpDdns or Logging objects.
syntax_map: LCURLY_BRACKET {
// This code is executed when we're about to start parsing
// the content of the map
......@@ -227,6 +228,7 @@ global_object: dhcp6_json_object
| logging_object
| dhcp4_json_object
| dhcpddns_object
| control_agent_json_object
| unknown_map_entry
;
......@@ -613,6 +615,13 @@ dhcp4_json_object: DHCP4 {
ctx.leave();
};
control_agent_json_object: CONTROL_AGENT {
ctx.enter(ctx.NO_KEYWORD);
} COLON value {
ctx.stack_.back()->set("Control-agent", $4);
ctx.leave();
};
// --- logging entry -----------------------------------------
// This defines the top level "Logging" object. It parses
......
......@@ -159,6 +159,11 @@ TEST(ParserTest, keywordDhcp4) {
testParser(txt, D2ParserContext::PARSER_DHCPDDNS);
}
TEST(ParserTest, keywordControlAgent) {
string txt = "{ \"Control-agent\": { } }";
testParser(txt, D2ParserContext::PARSER_DHCPDDNS);
}
TEST(ParserTest, Logging) {
string txt = "{ \"Logging\": { \n"
" \"loggers\": [ \n"
......
......@@ -1246,6 +1246,15 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
}
}
\"Control-agent\" {
switch(driver.ctx_) {
case isc::dhcp::Parser4Context::CONFIG:
return isc::dhcp::Dhcp4Parser::make_CONTROL_AGENT(driver.loc_);
default:
return isc::dhcp::Dhcp4Parser::make_STRING("Control-agent", driver.loc_);
}
}
\"4o6-interface\" {
switch(driver.ctx_) {
case isc::dhcp::Parser4Context::SUBNET4:
......
......@@ -183,6 +183,7 @@ using namespace std;
DHCP6 "Dhcp6"
DHCPDDNS "DhcpDdns"
CONTROL_AGENT "Control-agent"
// Not real tokens, just a way to signal what the parser is expected to
// parse.
......@@ -338,8 +339,8 @@ unknown_map_entry: STRING COLON {
};
// This defines the top-level { } that holds Dhcp6, Dhcp4, DhcpDdns or Logging
// objects.
// This defines the top-level { } that holds Control-agent, Dhcp6, Dhcp4,
// DhcpDdns or Logging objects.
syntax_map: LCURLY_BRACKET {
// This code is executed when we're about to start parsing
// the content of the map
......@@ -351,7 +352,8 @@ syntax_map: LCURLY_BRACKET {
// for it.
};
// This represents top-level entries: Dhcp6, Dhcp4, DhcpDdns, Logging
// This represents top-level entries: Control-agent, Dhcp6, Dhcp4,
// DhcpDdns, Logging
global_objects: global_object
| global_objects COMMA global_object
;
......@@ -361,6 +363,7 @@ global_object: dhcp4_object
| logging_object
| dhcp6_json_object
| dhcpddns_json_object
| control_agent_json_object
| unknown_map_entry
;
......@@ -1656,6 +1659,13 @@ dhcpddns_json_object: DHCPDDNS {
ctx.leave();
};
control_agent_json_object: CONTROL_AGENT {
ctx.enter(ctx.NO_KEYWORD);
} COLON value {
ctx.stack_.back()->set("Control-agent", $4);
ctx.leave();
};
// --- logging entry -----------------------------------------
// This defines the top level "Logging" object. It parses
......
......@@ -183,6 +183,31 @@ TEST_F(JSONFileBackendTest, jsonFile) {
EXPECT_EQ(Lease::TYPE_V4, pools3.at(0)->getType());
}
// This test verifies that the configurations for various servers
// can coexist and that the DHCPv4 configuration parsers will simply
// ignore them.
TEST_F(JSONFileBackendTest, serverConfigurationsCoexistence) {
std::string config = "{ \"Dhcp4\": {"
"\"rebind-timer\": 2000, "
"\"renew-timer\": 1000, \n"
"\"valid-lifetime\": 4000 }, "
"\"Dhcp6\": { },"
"\"DhcpDdns\": { },"
"\"Control-agent\": { }"
"}";
writeFile(TEST_FILE, config);
// Now initialize the server
boost::scoped_ptr<ControlledDhcpv4Srv> srv;
ASSERT_NO_THROW(
srv.reset(new ControlledDhcpv4Srv(0))
);
// And configure it using the config file.
EXPECT_NO_THROW(srv->init(TEST_FILE));
}
// This test checks if configuration can be read from a JSON file
// using hash (#) line comments
TEST_F(JSONFileBackendTest, hashComments) {
......
......@@ -1377,6 +1377,16 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
}
}
\"Control-agent\" {
switch(driver.ctx_) {
case isc::dhcp::Parser6Context::CONFIG:
return isc::dhcp::Dhcp6Parser::make_CONTROL_AGENT(driver.loc_);
default:
return isc::dhcp::Dhcp6Parser::make_STRING("Control-agent", driver.loc_);
}
}
{JSONString} {
/* A string has been matched. It contains the actual string and single quotes.
We need to get those quotes out of the way and just use its content, e.g.
......
......@@ -190,6 +190,7 @@ using namespace std;
DHCP4 "Dhcp4"
DHCPDDNS "DhcpDdns"
CONTROL_AGENT "Control-agent"
// Not real tokens, just a way to signal what the parser is expected to
// parse.
......@@ -347,8 +348,8 @@ unknown_map_entry: STRING COLON {
};
// This defines the top-level { } that holds Dhcp6, Dhcp4, DhcpDdns or Logging
// objects.
// This defines the top-level { } that holds Control-agent, Dhcp6, Dhcp4,
// DhcpDdns or Logging objects.
syntax_map: LCURLY_BRACKET {
// This code is executed when we're about to start parsing
// the content of the map
......@@ -370,6 +371,7 @@ global_object: dhcp6_object
| logging_object
| dhcp4_json_object
| dhcpddns_json_object
| control_agent_json_object
| unknown_map_entry
;
......@@ -1752,6 +1754,14 @@ dhcpddns_json_object: DHCPDDNS {
ctx.leave();
};
control_agent_json_object: CONTROL_AGENT {
ctx.enter(ctx.NO_KEYWORD);
} COLON value {
ctx.stack_.back()->set("Control-agent", $4);
ctx.leave();
};
// --- logging entry -----------------------------------------
// This defines the top level "Logging" object. It parses
......
......@@ -169,6 +169,32 @@ TEST_F(JSONFileBackendTest, jsonFile) {
EXPECT_EQ(Lease::TYPE_NA, pools3.at(0)->getType());
}
// This test verifies that the configurations for various servers
// can coexist and that the DHCPv6 configuration parsers will simply
// ignore them.
TEST_F(JSONFileBackendTest, serverConfigurationsCoexistence) {
std::string config = "{ \"Dhcp6\": {"
"\"rebind-timer\": 2000, "
"\"renew-timer\": 1000, \n"
"\"preferred-lifetime\": 1000, \n"
"\"valid-lifetime\": 4000 }, "
"\"Dhcp4\": { },"
"\"DhcpDdns\": { },"
"\"Control-agent\": { }"
"}";
writeFile(TEST_FILE, config);
// Now initialize the server
boost::scoped_ptr<ControlledDhcpv6Srv> srv;
ASSERT_NO_THROW(
srv.reset(new ControlledDhcpv6Srv(0))
);
// And configure it using the config file.
EXPECT_NO_THROW(srv->init(TEST_FILE));
}
// This test checks if configuration can be read from a JSON file
// using hash (#) line comments
TEST_F(JSONFileBackendTest, hashComments) {
......
/keactrl
/kea.conf
/kea-ca.conf
/keactrl.conf
/keactrl.8
......@@ -5,16 +5,16 @@ SUBDIRS = . tests
# If the default location needs to be changed it may be achieved by
# setting KEACTRL_CONF environment variable.
sbin_SCRIPTS = keactrl
CONFIGFILES = keactrl.conf kea.conf kea-ca.conf
CONFIGFILES = keactrl.conf kea.conf
man_MANS = keactrl.8
DISTCLEANFILES = keactrl keactrl.conf $(man_MANS)
CLEANFILES = kea.conf kea-ca.conf
EXTRA_DIST = keactrl.in keactrl.conf.in kea.conf.pre kea-ca.conf.pre $(man_MANS) keactrl.xml
CLEANFILES = kea.conf
EXTRA_DIST = keactrl.in keactrl.conf.in kea.conf.pre $(man_MANS) keactrl.xml
# kea.conf and kea-ca.conf are not really sources used for building other targets, but we need
# these files to be generated before make install is called.
BUILT_SOURCES = kea.conf kea-ca.conf
# kea.conf is not really a source used for building other targets, but we need
# this file to be generated before make install is called.
BUILT_SOURCES = kea.conf
if GENERATE_DOCS
......@@ -32,10 +32,6 @@ endif
kea.conf: kea.conf.pre
$(top_builddir)/tools/path_replacer.sh $(top_srcdir)/src/bin/keactrl/kea.conf.pre $@
kea-ca.conf: kea-ca.conf.pre
$(top_builddir)/tools/path_replacer.sh $(top_srcdir)/src/bin/keactrl/kea-ca.conf.pre $@
if INSTALL_CONFIGURATIONS
install-data-local:
......
// This is a basic configuraton for the Kea Control Agent.
{
// RESTful interface to be available at http://127.0.0.1:8080/
"Control-agent": {
"http-host": "127.0.0.1",
"http-port": 8080,
// Specify location of the files to which the Control Agent
// should connect to forward commands to the DHCPv4 and DHCPv6
// server via unix domain socket.
"control-sockets": {
"dhcp4": {
"socket-type": "unix",
"socket-name": "/tmp/kea-dhcp4-ctrl.sock"
},
"dhcp6": {
"socket-type": "unix",
"socket-name": "/tmp/kea-dhcp6-ctrl.sock"
}
},
// Specify hooks libraries that are attached to the Control Agent.
// Such hooks libraries should support 'control_command_receive'
// hook point. This is currently commented out because it has to
// point to the existing hooks library. Otherwise the Control
// Agent will fail to start.
"hooks-libraries": [
// {
// "library": "/opt/local/control-agent-commands.so",
// "parameters": {
// "param1": "foo"
// }
// }
]
},
// Basic logging configuration for the Control Agent.
"Logging": {
"loggers": [ {
"name": "kea-ctrl-agent",
"severity": "INFO"
} ]
}
}
// This is a basic configuration for the Kea DHCPv4 and DHCPv6 servers. Subnet
// declarations are mostly commented out and no interfaces are listed.
// Therefore, the servers will not listen or respond to any queries. The basic
// configuration must be extended to specify interfaces on which the servers
// should listen. There are a number of example options defined. These probably
// don't make any sense in your network. Make sure you at least update the
// following, before running this example in your network:
// This is a basic configuration for the Kea DHCP servers and Kea Control
// Agent. Subnet declarations are mostly commented out and no interfaces are
// listed. Therefore, the servers will not listen or respond to any queries.
// The basic configuration must be extended to specify interfaces on which
// the servers should listen. There are a number of example options defined.
// These probably don't make any sense in your network. Make sure you at least
// update the following, before running this example in your network:
// - change the network interface names
// - change the subnets to match your actual network
// - change the option values to match your network
......@@ -734,6 +734,41 @@
"reverse-ddns" : {}
},
// This is a basic configuraton for the Kea Control Agent.
// RESTful interface to be available at http://127.0.0.1:8080/