<title>Shell Usage</title>
<para><command>kea-shell</command> is run as follows:
<screen>
-kea-shell [--host hostname] [--port number] [--timeout seconds] [command]
+kea-shell [--host hostname] [--port number] [--timeout seconds] [--service service-name] [command]
</screen>
where:
</para>
</simpara>
</listitem>
+ <listitem>
+ <simpara>
+ <command>--service <replaceable>serive-name</replaceable></command> specifies the
+ target of an command. If not given, CA will be used as target. May be used multiple times
+ </simpara>
+ </listitem>
+
+
<listitem>
<simpara>
<command>command</command> specifies the command to be sent. If not specified,
<para>The following shows a simple example of usage:
<screen>
-$ <userinput>kea-shell --host 192.0.2.1 --port 8001 list-commands</userinput>
+$ <userinput>kea-shell --host 192.0.2.1 --port 8001 --service dhcp4 list-commands</userinput>
^D
</screen>
After the command line is entered, the program waits for command parameters to be entered.
Since <command>list-commands</command> does not take any
arguments, CTRL-D (represented in the above example by "^D") is pressed to indicate end
of file (and so terminate the parameter input). The Shell will then contact
- the CA and print out the list of available commands returned.
+ the CA and print out the list of available commands returned for service named <command>dhcp4</command>.
</para>
<para>It is envisaged that Kea Shell will be most frequently used in scripts. The next example
- shows a simple scripted execution. It sends the command "config-write" to the CA, along
+ shows a simple scripted execution. It sends the command "config-write" to the CA
+ (<command> --service </command> parameter hasn't been used), along
with the parameters specified in param.json. The result will be stored in result.json.
<screen>
$ cat param.json
parser.add_argument('--timeout', type=int, default='10',
help='Timeout (in seconds) when attempting to '
'connect to CA (default: 10)')
+ parser.add_argument('--service', nargs="?", action="append",
+ help='target spcified service. If not specidied,'
+ 'control agent will receive command.')
parser.add_argument('command', type=str, nargs="?",
default='list-commands',
help='command to be executed. If not specified, '
# used by the connection.
params = CARequest()
params.command = cmd_args.command
+ params.service = cmd_args.service
params.http_host = cmd_args.host
params.http_port = cmd_args.port
params.timeout = cmd_args.timeout
<docinfo>
<copyright>
- <year>2016</year>
+ <year>2017</year>
<holder>Internet Systems Consortium, Inc. ("ISC")</holder>
</copyright>
</docinfo>
<arg><option>--host</option></arg>
<arg><option>--port</option></arg>
<arg><option>--timeout</option></arg>
+ <arg><option>--service</option></arg>
<arg><option>command</option></arg>
</cmdsynopsis>
</refsynopsisdiv>
</para></listitem>
</varlistentry>
+ <varlistentry>
+ <term><option>--service</option></term>
+ <listitem><para>
+ Specifies the service that is tartget of a command. If not
+ specified, Cotrol Agent will be targeted. May be used multiple times.
+ </para></listitem>
+ </varlistentry>
+
<varlistentry>
<term><option>command</option></term>
<listitem><para>
- http_host - hostname of the CA
- http-port - TCP port of the CA
- command - specifies the command to send (e.g. list-commands)
+ - service - specifies service that is target for the command (e.g. dhcp4)
- timeout - timeout (in ms)
- args - extra arguments my be added here
- headers - extra HTTP headers may be added here
http_host = ''
http_port = 0
command = ''
+ service = ''
timeout = 0
args = ''
headers = {}
this stores the output in self.content
"""
self.content = '{ "command": "' + self.command + '"'
+ if self.service is not None:
+ self.service = [x for x in self.service if x]
+ if len(self.service) > 0:
+ self.content += ', "service": ["' + '","'.join(self.service) + '"]'
if len(self.args) > 1:
self.content += ', "arguments": { ' + self.args + ' }'
self.content += ' }'
"""
pass
+ def test_body_with_service(self):
+ """
+ This test verifies if the CARequest object generates the request
+ content properly when there is one target service.
+ """
+ request = CARequest()
+ request.command = "foo"
+ request.service= ["service1"]
+ request.generate_body()
+ self.assertEqual(request.content, '{ "command": "foo", "service": ["service1"] }')
+
+ def test_body_with_multiple_service(self):
+ """
+ This test verifies if the CARequest object generates the request
+ content properly when there are two target service.
+ """
+ request = CARequest()
+ request.command = "foo"
+ request.service= ["service1","service2/2"]
+ request.generate_body()
+ self.assertEqual(request.content, '{ "command": "foo", "service": ["service1","service2/2"] }')
+
+ def test_body_with_malformed_service(self):
+ """
+ This test verifies if the CARequest object generates the request
+ content properly when there are two target service, one is empty
+ """
+ request = CARequest()
+ request.command = "foo"
+ request.service= ["service1",""]
+ request.generate_body()
+ self.assertEqual(request.content, '{ "command": "foo", "service": ["service1"] }')
+
def test_body_without_args(self):
"""
This test verifies if the CARequest object generates the request