]> git.puffer.fish Git - matthieu/frr.git/commitdiff
lib: add facility to log all CLI commands
authorLou Berger <lberger@labn.net>
Tue, 12 Jan 2016 18:41:49 +0000 (13:41 -0500)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Thu, 9 Jun 2016 15:01:34 +0000 (11:01 -0400)
Signed-off-by: Lou Berger <lberger@labn.net>
(cherry picked from commit c7f7e49a4f68c92152384582ff70d64609858170)

lib/vty.c

index 85fc9bd5cbd179edf083db018b2b38c3b22aa2b7..68bf814ffd8f619ca7b6587e065256de7d142390 100644 (file)
--- a/lib/vty.c
+++ b/lib/vty.c
@@ -111,7 +111,7 @@ vty_out (struct vty *vty, const char *format, ...)
     {
       /* Try to write to initial buffer.  */
       va_start (args, format);
-      len = vsnprintf (buf, sizeof buf, format, args);
+      len = vsnprintf (buf, sizeof(buf), format, args);
       va_end (args);
 
       /* Initial buffer is not enough.  */
@@ -402,7 +402,41 @@ vty_command (struct vty *vty, char *buf)
   int ret;
   vector vline;
   const char *protocolname;
+  char *cp;
 
+  /*
+   * Log non empty command lines
+   */
+  cp = buf;
+  if (cp != NULL)
+    {
+      /* Skip white spaces. */
+      while (isspace ((int) *cp) && *cp != '\0')
+        cp++;
+    }
+  if (cp != NULL && *cp != '\0')
+    {
+      unsigned i;
+      char     vty_str[VTY_BUFSIZ];
+      char        prompt_str[VTY_BUFSIZ];
+
+      /* format the base vty info */
+      snprintf(vty_str, sizeof(vty_str), "vty[??]@%s", vty->address);
+      if (vty)
+        for (i = 0; i < vector_active (vtyvec); i++)
+          if (vty == vector_slot (vtyvec, i))
+            {
+              snprintf(vty_str, sizeof(vty_str), "vty[%d]@%s",
+                                                 i, vty->address);
+              break;
+            }
+
+      /* format the prompt */
+      snprintf(prompt_str, sizeof(prompt_str), cmd_prompt (vty->node), vty_str);
+
+      /* now log the command */
+      zlog(NULL, LOG_NOTICE, "%s%s", prompt_str, buf);
+    }
   /* Split readline string up into the vector */
   vline = cmd_make_strvec (buf);
 
@@ -1572,7 +1606,7 @@ vty_flush (struct thread *thread)
   erase = ((vty->status == VTY_MORE || vty->status == VTY_MORELINE));
 
   /* N.B. if width is 0, that means we don't know the window size. */
-  if ((vty->lines == 0) || (vty->width == 0))
+  if ((vty->lines == 0) || (vty->width == 0) || (vty->height == 0))
     flushrc = buffer_flush_available(vty->obuf, vty_sock);
   else if (vty->status == VTY_MORELINE)
     flushrc = buffer_flush_window(vty->obuf, vty_sock, vty->width,