vppctl,cli: Improve non-interactive vppctl (VPP-944) 91/8491/6
authorChris Luke <chrisy@flirble.org>
Thu, 21 Sep 2017 03:31:24 +0000 (23:31 -0400)
committerFlorin Coras <florin.coras@gmail.com>
Thu, 21 Sep 2017 22:54:33 +0000 (22:54 +0000)
commit03add7f5b5e5351790187ea6d7e83803d5be2440
tree5d7b341c150fb55ab465c520235f8da2264fff7d
parented3c160983d302909dee5223675a2b356d306c81
vppctl,cli: Improve non-interactive vppctl (VPP-944)

Short version: Make vppctl behave as expected when run
from scripts, or without a controlling terminal, and
especially when using it with VPP commands on its
command line ("non-interactively").

In particular, prevent the welcome banner and VPP CLI
prompt from being sent by VPP when being used in these
ways.

vppctl
------

- Improve vppctl's detection of non-interactive sessions.
- Pass non-interactiveness in the terminal type telnet option
  as a value distinct from "dumb" (which means non-ANSI capable.)
- Make tty setup handling more robust.
- Only send non-interactive command once we've sent the
  terminal type, to ensure correct event sequence; we need
  the VPP cli session to be in line-by-line mode.
- Ignore stdin when it looks something like /dev/null.
- Skip NUL bytes received from VPP.

VPP CLI
-------

- Detect "non-interactive" terminal types and set session
  parameters accordingly.
- Add an "interactive" flag that controls whether the welcome
  banner and CLI prompt are sent.
- Detect if telnet options processing switched us into line
  mode and act accordingly for the rest of the current input
  buffer. This was causing the command string to be echoed
  by the CLI editor code.
- For non-interactive sessions, send a NUL byte after the
  input buffer has been processed. This is because vppctl
  depends on seeing traffic before it will try to close the
  session; a command with no output would cause it to hang.
  NUL bytes are ignored by all decent terminals, but we have
  vppctl strip them out anyway.
- Prevent certain commands from running in non-interactive
  sessions since they manipulate interactive-related features.
- For interactive sessions, quench the prompt that prints on
  VPP shutdown.
- Detect and handle socket errors in the CLI; sessions were
  leaking.
- Pevent SIGPIPE from ever being raised; handle EPIPE instead.
  We don't need VPP to die just because a socket closed just
  before we try to write to it!
- Add a command to dump a list of current CLI sessions; mostly
  this was to detect session leakage, but it may have some
  general utility.

Change-Id: Ia147da013317180882c1d967b18eefb8519a55fb
Signed-off-by: Chris Luke <chrisy@flirble.org>
src/vlib/unix/cli.c
src/vpp/app/vppctl.c