Add a (small) banner to the Debug and Telnet CLI 70/870/3
authorChris Luke <chrisy@flirble.org>
Mon, 25 Apr 2016 17:49:07 +0000 (13:49 -0400)
committerDave Barach <openvpp@barachs.net>
Wed, 27 Apr 2016 13:32:48 +0000 (13:32 +0000)
    _______    _        _   _____  ___
 __/ __/ _ \  (_)__    | | / / _ \/ _ \
 _/ _// // / / / _ \   | |/ / ___/ ___/
 /_/ /____(_)_/\___/   |___/_/  /_/

- For terminals that look like they support ANSI output the FD.io
  part is colored red.
- This is only shown at the start of a debug CLI or a telnet CLI
  session.
- This banner can be disabled with "cli-no-banner" in the "unix"
  section of the startup config file.

Change-Id: I085b3780dcca3eae546859dbde6c1c34c8258b9f
Signed-off-by: Chris Luke <chrisy@flirble.org>
vlib/vlib/unix/cli.c
vlib/vlib/unix/main.c
vlib/vlib/unix/unix.h

index 809be73..6019956 100644 (file)
 
 /* ANSI sequences. */
 #define ANSI_CLEAR  CSI "2J" CSI "1;1H"
+#define ANSI_RESET  CSI "0m"
+#define ANSI_BOLD   CSI "1m"
+#define ANSI_DIM    CSI "2m"
+#define ANSI_DRED   ANSI_DIM CSI "31m"
+#define ANSI_BRED   ANSI_BOLD CSI "31m"
+#define ANSI_CLEAR  CSI "2J" CSI "1;1H"
 
 /** Maximum depth into a byte stream from which to compile a Telnet
  * protocol message. This is a saftey measure. */
 #define UNIX_CLI_STDIN_FD 0
 
 
+typedef struct {
+  u8 * line;
+  u32 length;
+} unix_cli_banner_t;
+
+#define _(a) { .line = (u8 *)(a), .length = sizeof(a) - 1 }
+/** Plain welcome banner. */
+static unix_cli_banner_t unix_cli_banner[] = {
+_("    _______    _        _   _____  ___ \n"),
+_(" __/ __/ _ \\  (_)__    | | / / _ \\/ _ \\\n"),
+_(" _/ _// // / / / _ \\   | |/ / ___/ ___/\n"),
+_(" /_/ /____(_)_/\\___/   |___/_/  /_/    \n"),
+_("\n")
+};
+/** ANSI color welcome banner. */
+static unix_cli_banner_t unix_cli_banner_color[] = {
+_(ANSI_BRED "    _______    _     " ANSI_RESET "   _   _____  ___ \n"),
+_(ANSI_BRED " __/ __/ _ \\  (_)__ " ANSI_RESET "   | | / / _ \\/ _ \\\n"),
+_(ANSI_BRED " _/ _// // / / / _ \\" ANSI_RESET "   | |/ / ___/ ___/\n"),
+_(ANSI_BRED " /_/ /____(_)_/\\___/" ANSI_RESET "   |___/_/  /_/    \n"),
+_("\n")
+};
+#undef _
+
+
 /** Unix CLI session. */
 typedef struct {
   u32 unix_file_index;
@@ -468,18 +499,44 @@ static u8 unix_cli_terminal_type(u8 * term, uword len)
   return 0;
 }
 
-/** \brief Emit initial prompt on a connection. */
+/** \brief Emit initial welcome banner and prompt on a connection. */
 static void unix_cli_file_welcome(unix_cli_main_t * cm, unix_cli_file_t * cf)
 {
   unix_main_t * um = &unix_main;
   unix_file_t * uf = pool_elt_at_index (um->file_pool, cf->unix_file_index);
+  unix_cli_banner_t *banner;
+  int i, len;
 
   /*
    * Put the first bytes directly into the buffer so that further output is
    * queued until everything is ready. (oterwise initial prompt can appear
    * mid way through VPP initialization)
    */
-  unix_cli_add_pending_output (uf, cf,
+  unix_cli_add_pending_output (uf, cf, (u8 *)"\r", 1);
+
+  if (!um->cli_no_banner)
+    {
+      if (cf->ansi_capable)
+        {
+          banner = unix_cli_banner_color;
+          len = ARRAY_LEN(unix_cli_banner_color);
+        }
+      else
+        {
+          banner = unix_cli_banner;
+          len = ARRAY_LEN(unix_cli_banner);
+        }
+
+      for (i = 0; i < len; i++)
+        {
+          unix_vlib_cli_output_cooked(cf, uf,
+            banner[i].line,
+            banner[i].length);
+        }
+      }
+
+  /* Prompt. */
+  unix_vlib_cli_output_raw (cf, uf,
              cm->cli_prompt,
              vec_len (cm->cli_prompt));
 
index d6976b1..1d8bd28 100644 (file)
@@ -312,6 +312,8 @@ unix_config (vlib_main_t * vm, unformat_input_t * input)
        ;
       else if (unformat (input, "cli-line-mode"))
         um->cli_line_mode = 1;
+      else if (unformat (input, "cli-no-banner"))
+        um->cli_no_banner = 1;
       else if (unformat (input, "cli-history-limit %d", &um->cli_history_limit))
         ;
       else if (unformat (input, "full-coredump"))
index 269b9df..20aec67 100644 (file)
@@ -103,12 +103,16 @@ typedef struct {
   /* CLI log file. GIGO. */
   u8 *log_filename;
   int log_fd;
+
   /* Don't put CLI connections into character mode */
   int cli_line_mode;
 
   /* Maximum amount of command line history to keep per session */
   u32 cli_history_limit;
 
+  /* Suppress the welcome banner at CLI session start */
+  int cli_no_banner;
+
   /* Store the original state of stdin when it's a tty */
   struct termios tio_stdin;
   int tio_isset;