From 1035065f2a2f1c642441c2f6f940c8bc53280846 Mon Sep 17 00:00:00 2001 From: Lou Berger Date: Tue, 12 Jan 2016 13:41:49 -0500 Subject: [PATCH] lib: add facility to log all CLI commands Signed-off-by: Lou Berger (cherry picked from commit c7f7e49a4f68c92152384582ff70d64609858170) --- lib/vty.c | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/lib/vty.c b/lib/vty.c index 85fc9bd5cb..68bf814ffd 100644 --- 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, -- 2.39.5