123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- #!@PYTHON@
- # Copyright (C) 2017 Internet Systems Consortium, Inc. ("ISC")
- #
- # 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/.
- """
- Text client for Control Agent process
- """
- # First, let's import the right kea_connector.
- # We have two versions: one for python 2.x and another for python 3.x.
- # Sadly, there's no unified way to handle http connections. The recommended
- # way is to use Requests (http://docs.python-requests.org/en/master/), but
- # that's a stand alone package that requires separate installation. One of
- # the design requirements was to not require any additional packages, so
- # the code uses standard libraries available in python. Hence two versions.
- import sys
- import signal
- import argparse
- from kea_conn import CARequest # CAResponse
- if sys.version_info[0] == 2:
- # This is Python 2.x
- import kea_connector2 as kea_connector
- elif sys.version_info[0] == 3:
- # This is Python 3.x
- import kea_connector3 as kea_connector
- else:
- # This is... have no idea what it is.
- raise SystemExit("Unknown python version:" + str(sys.version_info[0]))
- def timeout_handler(signum, frame):
- """Connection timeoout handler"""
- del signum, frame
- print("Connection timeout")
- sys.exit(1)
- VERSION = "@PACKAGE_VERSION@"
- def shell_body():
- """
- Second step: Need to parse command line parameters. We will use
- argparse for that purpose. It does great job with having default
- values, taking care of the help and sanity checking input
- parameters.
- """
- parser = argparse.ArgumentParser(description='kea-shell is a simple text '
- 'client that uses REST interface to '
- 'connect to Kea Control Agent.')
- parser.add_argument('--host', type=str, default='127.0.0.1',
- help='hostname of the CA to connect to '
- '(defaul:; 127.0.0.1)')
- parser.add_argument('--port', type=int, default=8000,
- help='TCP port of the CA to connect to '
- '(default: 8000)')
- parser.add_argument('--timeout', type=int, default='10',
- help='Timeout (in seconds) when attempting to '
- 'connect to CA (default: 10)')
- parser.add_argument('command', type=str, nargs="?",
- default='list-commands',
- help='command to be executed. If not specified, '
- '"list-commands" is used')
- parser.add_argument('-v', action="store_true", help="Prints version")
- cmd_args = parser.parse_args()
- if cmd_args.v:
- print(VERSION)
- exit(0)
- # Ok, now it's time to put the parameters parsed into the structure to be
- # used by the connection.
- params = CARequest()
- params.command = cmd_args.command
- params.http_host = cmd_args.host
- params.http_port = cmd_args.port
- params.timeout = cmd_args.timeout
- params.version = VERSION
- params.generate_body()
- params.generate_headers()
- # Load command processor
- # @todo - command specific processing will be added as part of
- # future work (either #5138 or #5139, whichever is implemented
- # first)
- # Read parameters from stdin (they're optional for some commands)
- for line in sys.stdin:
- params.params += line
- # Set the timeout timer. If the connection takes too long,
- # it will send a signal to us.
- signal.signal(signal.SIGALRM, timeout_handler)
- signal.alarm(params.timeout)
- # Ok, everything is ready. Let's send the command and get a response.
- try:
- resp = kea_connector.send_to_control_agent(params)
- except Exception as exc:
- print("Failed to run: " + str(exc))
- sys.exit(1)
- resp.print_response()
- sys.exit(0)
- if __name__ == "__main__":
- shell_body()
|