mirror of
https://github.com/openvswitch/ovs
synced 2025-08-30 05:47:55 +00:00
ovsdb-client: Add optional timestamps to "monitor" command output.
Suggestion #9347. Suggested-by: Alan Shieh <ashieh@nicira.com> Signed-off-by: Ben Pfaff <blp@nicira.com>
This commit is contained in:
parent
c2158145f3
commit
8f46c9bb84
3
NEWS
3
NEWS
@ -20,6 +20,9 @@ post-v1.5.0
|
|||||||
should maintain by updating with ofproto_rule_update_used().
|
should maintain by updating with ofproto_rule_update_used().
|
||||||
- The default MAC learning timeout has been increased from 60 seconds
|
- The default MAC learning timeout has been increased from 60 seconds
|
||||||
to 300 seconds. The MAC learning timeout is now configurable.
|
to 300 seconds. The MAC learning timeout is now configurable.
|
||||||
|
- ovsdb-client:
|
||||||
|
- The new option --timestamp causes the "monitor" command to print
|
||||||
|
a timestamp with every update.
|
||||||
|
|
||||||
|
|
||||||
v1.5.0 - xx xxx xxxx
|
v1.5.0 - xx xxx xxxx
|
||||||
|
43
lib/table.c
43
lib/table.c
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2009, 2010, 2011 Nicira Networks.
|
* Copyright (c) 2009, 2010, 2011, 2012 Nicira Networks.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -24,6 +24,7 @@
|
|||||||
#include "json.h"
|
#include "json.h"
|
||||||
#include "ovsdb-data.h"
|
#include "ovsdb-data.h"
|
||||||
#include "ovsdb-error.h"
|
#include "ovsdb-error.h"
|
||||||
|
#include "timeval.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
struct column {
|
struct column {
|
||||||
@ -123,6 +124,14 @@ table_set_caption(struct table *table, char *caption)
|
|||||||
table->caption = caption;
|
table->caption = caption;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Turns printing a timestamp along with 'table' on or off, according to
|
||||||
|
* 'timestamp'. */
|
||||||
|
void
|
||||||
|
table_set_timestamp(struct table *table, bool timestamp)
|
||||||
|
{
|
||||||
|
table->timestamp = timestamp;
|
||||||
|
}
|
||||||
|
|
||||||
/* Adds a new column to 'table' just to the right of any existing column, with
|
/* Adds a new column to 'table' just to the right of any existing column, with
|
||||||
* 'heading' as a title for the column. 'heading' must be a valid printf()
|
* 'heading' as a title for the column. 'heading' must be a valid printf()
|
||||||
* format specifier.
|
* format specifier.
|
||||||
@ -211,6 +220,24 @@ table_print_table_line__(struct ds *line)
|
|||||||
ds_clear(line);
|
ds_clear(line);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
table_format_timestamp__(char *s, size_t size)
|
||||||
|
{
|
||||||
|
time_t now = time_wall();
|
||||||
|
strftime(s, size, "%Y-%m-%d %H:%M:%S", localtime(&now));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
table_print_timestamp__(const struct table *table)
|
||||||
|
{
|
||||||
|
if (table->timestamp) {
|
||||||
|
char s[32];
|
||||||
|
|
||||||
|
table_format_timestamp__(s, sizeof s);
|
||||||
|
puts(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
table_print_table__(const struct table *table, const struct table_style *style)
|
table_print_table__(const struct table *table, const struct table_style *style)
|
||||||
{
|
{
|
||||||
@ -223,6 +250,8 @@ table_print_table__(const struct table *table, const struct table_style *style)
|
|||||||
putchar('\n');
|
putchar('\n');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
table_print_timestamp__(table);
|
||||||
|
|
||||||
if (table->caption) {
|
if (table->caption) {
|
||||||
puts(table->caption);
|
puts(table->caption);
|
||||||
}
|
}
|
||||||
@ -286,6 +315,8 @@ table_print_list__(const struct table *table, const struct table_style *style)
|
|||||||
putchar('\n');
|
putchar('\n');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
table_print_timestamp__(table);
|
||||||
|
|
||||||
if (table->caption) {
|
if (table->caption) {
|
||||||
puts(table->caption);
|
puts(table->caption);
|
||||||
}
|
}
|
||||||
@ -357,6 +388,8 @@ table_print_html__(const struct table *table, const struct table_style *style)
|
|||||||
{
|
{
|
||||||
size_t x, y;
|
size_t x, y;
|
||||||
|
|
||||||
|
table_print_timestamp__(table);
|
||||||
|
|
||||||
fputs("<table border=1>\n", stdout);
|
fputs("<table border=1>\n", stdout);
|
||||||
|
|
||||||
if (table->caption) {
|
if (table->caption) {
|
||||||
@ -427,6 +460,8 @@ table_print_csv__(const struct table *table, const struct table_style *style)
|
|||||||
putchar('\n');
|
putchar('\n');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
table_print_timestamp__(table);
|
||||||
|
|
||||||
if (table->caption) {
|
if (table->caption) {
|
||||||
puts(table->caption);
|
puts(table->caption);
|
||||||
}
|
}
|
||||||
@ -465,6 +500,12 @@ table_print_json__(const struct table *table, const struct table_style *style)
|
|||||||
if (table->caption) {
|
if (table->caption) {
|
||||||
json_object_put_string(json, "caption", table->caption);
|
json_object_put_string(json, "caption", table->caption);
|
||||||
}
|
}
|
||||||
|
if (table->timestamp) {
|
||||||
|
char s[32];
|
||||||
|
|
||||||
|
table_format_timestamp__(s, sizeof s);
|
||||||
|
json_object_put_string(json, "time", s);
|
||||||
|
}
|
||||||
|
|
||||||
headings = json_array_create_empty();
|
headings = json_array_create_empty();
|
||||||
for (x = 0; x < table->n_columns; x++) {
|
for (x = 0; x < table->n_columns; x++) {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2009, 2010, 2011 Nicira Networks.
|
* Copyright (c) 2009, 2010, 2011, 2012 Nicira Networks.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -32,11 +32,13 @@ struct table {
|
|||||||
size_t n_rows, allocated_rows;
|
size_t n_rows, allocated_rows;
|
||||||
size_t current_column;
|
size_t current_column;
|
||||||
char *caption;
|
char *caption;
|
||||||
|
bool timestamp;
|
||||||
};
|
};
|
||||||
|
|
||||||
void table_init(struct table *);
|
void table_init(struct table *);
|
||||||
void table_destroy(struct table *);
|
void table_destroy(struct table *);
|
||||||
void table_set_caption(struct table *, char *caption);
|
void table_set_caption(struct table *, char *caption);
|
||||||
|
void table_set_timestamp(struct table *, bool timestamp);
|
||||||
|
|
||||||
void table_add_column(struct table *, const char *heading, ...)
|
void table_add_column(struct table *, const char *heading, ...)
|
||||||
PRINTF_FORMAT(2, 3);
|
PRINTF_FORMAT(2, 3);
|
||||||
|
@ -40,6 +40,7 @@ ovsdb\-client \- command-line interface to \fBovsdb-server\fR(1)
|
|||||||
[\fB\-\-pretty\fR]
|
[\fB\-\-pretty\fR]
|
||||||
[\fB\-\-bare\fR]
|
[\fB\-\-bare\fR]
|
||||||
[\fB\-\-no\-heading\fR]
|
[\fB\-\-no\-heading\fR]
|
||||||
|
[\fB\-\-timestamp\fR]
|
||||||
.so lib/daemon-syn.man
|
.so lib/daemon-syn.man
|
||||||
.so lib/vlog-syn.man
|
.so lib/vlog-syn.man
|
||||||
.so lib/ssl-syn.man
|
.so lib/ssl-syn.man
|
||||||
@ -137,6 +138,12 @@ The following options controlling output formatting:
|
|||||||
.ds TD (default)
|
.ds TD (default)
|
||||||
.so lib/table.man
|
.so lib/table.man
|
||||||
.
|
.
|
||||||
|
.IP "\fB\-\-timestamp\fR"
|
||||||
|
For the \fB\-\-monitor\fR command, adds a timestamp to each table
|
||||||
|
update. Most output formats add the timestamp on a line of its own
|
||||||
|
just above the table. The JSON output format puts the timestamp in a
|
||||||
|
member of the top-level JSON object named \fBtime\fR.
|
||||||
|
.
|
||||||
.SS "Daemon Options"
|
.SS "Daemon Options"
|
||||||
The daemon options apply only to the \fBmonitor\fR command. With any
|
The daemon options apply only to the \fBmonitor\fR command. With any
|
||||||
other command, they have no effect.
|
other command, they have no effect.
|
||||||
|
@ -64,6 +64,9 @@ struct ovsdb_client_command {
|
|||||||
int argc, char *argv[]);
|
int argc, char *argv[]);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* --timestamp: Print a timestamp before each update on "monitor" command? */
|
||||||
|
static bool timestamp;
|
||||||
|
|
||||||
/* Format for table output. */
|
/* Format for table output. */
|
||||||
static struct table_style table_style = TABLE_STYLE_DEFAULT;
|
static struct table_style table_style = TABLE_STYLE_DEFAULT;
|
||||||
|
|
||||||
@ -160,6 +163,7 @@ parse_options(int argc, char *argv[])
|
|||||||
{
|
{
|
||||||
enum {
|
enum {
|
||||||
OPT_BOOTSTRAP_CA_CERT = UCHAR_MAX + 1,
|
OPT_BOOTSTRAP_CA_CERT = UCHAR_MAX + 1,
|
||||||
|
OPT_TIMESTAMP,
|
||||||
DAEMON_OPTION_ENUMS,
|
DAEMON_OPTION_ENUMS,
|
||||||
TABLE_OPTION_ENUMS
|
TABLE_OPTION_ENUMS
|
||||||
};
|
};
|
||||||
@ -167,6 +171,7 @@ parse_options(int argc, char *argv[])
|
|||||||
{"verbose", optional_argument, NULL, 'v'},
|
{"verbose", optional_argument, NULL, 'v'},
|
||||||
{"help", no_argument, NULL, 'h'},
|
{"help", no_argument, NULL, 'h'},
|
||||||
{"version", no_argument, NULL, 'V'},
|
{"version", no_argument, NULL, 'V'},
|
||||||
|
{"timestamp", no_argument, NULL, OPT_TIMESTAMP},
|
||||||
DAEMON_LONG_OPTIONS,
|
DAEMON_LONG_OPTIONS,
|
||||||
#ifdef HAVE_OPENSSL
|
#ifdef HAVE_OPENSSL
|
||||||
{"bootstrap-ca-cert", required_argument, NULL, OPT_BOOTSTRAP_CA_CERT},
|
{"bootstrap-ca-cert", required_argument, NULL, OPT_BOOTSTRAP_CA_CERT},
|
||||||
@ -207,6 +212,10 @@ parse_options(int argc, char *argv[])
|
|||||||
stream_ssl_set_ca_cert_file(optarg, true);
|
stream_ssl_set_ca_cert_file(optarg, true);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case OPT_TIMESTAMP:
|
||||||
|
timestamp = true;
|
||||||
|
break;
|
||||||
|
|
||||||
case '?':
|
case '?':
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
|
|
||||||
@ -256,7 +265,8 @@ usage(void)
|
|||||||
" (\"table\", \"html\", \"csv\", "
|
" (\"table\", \"html\", \"csv\", "
|
||||||
"or \"json\")\n"
|
"or \"json\")\n"
|
||||||
" --no-headings omit table heading row\n"
|
" --no-headings omit table heading row\n"
|
||||||
" --pretty pretty-print JSON in output");
|
" --pretty pretty-print JSON in output\n"
|
||||||
|
" --timestamp timestamp \"monitor\" output");
|
||||||
daemon_usage();
|
daemon_usage();
|
||||||
vlog_usage();
|
vlog_usage();
|
||||||
printf("\nOther options:\n"
|
printf("\nOther options:\n"
|
||||||
@ -532,6 +542,7 @@ monitor_print(struct json *table_updates,
|
|||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
table_init(&t);
|
table_init(&t);
|
||||||
|
table_set_timestamp(&t, timestamp);
|
||||||
|
|
||||||
if (table_updates->type != JSON_OBJECT) {
|
if (table_updates->type != JSON_OBJECT) {
|
||||||
ovs_error(0, "<table-updates> is not object");
|
ovs_error(0, "<table-updates> is not object");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user