bridge: add batch command support
This patch adds support to batch bridge commands. Follows ip batch code. Signed-off-by: Wilson Kok <wkok@cumulusnetworks.com> Signed-off-by: Roopa Prabhu <roopa@cumulusnetworks.com> Acked-by: Christophe Gouault <christophe.gouault@6wind.com>
This commit is contained in:
parent
6b53cb66e8
commit
9de8c6d976
|
|
@ -9,6 +9,7 @@
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
#include "SNAPSHOT.h"
|
#include "SNAPSHOT.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
@ -23,6 +24,8 @@ int show_stats;
|
||||||
int show_details;
|
int show_details;
|
||||||
int compress_vlans;
|
int compress_vlans;
|
||||||
int timestamp;
|
int timestamp;
|
||||||
|
char *batch_file;
|
||||||
|
int force;
|
||||||
const char *_SL_;
|
const char *_SL_;
|
||||||
|
|
||||||
static void usage(void) __attribute__((noreturn));
|
static void usage(void) __attribute__((noreturn));
|
||||||
|
|
@ -31,6 +34,7 @@ static void usage(void)
|
||||||
{
|
{
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"Usage: bridge [ OPTIONS ] OBJECT { COMMAND | help }\n"
|
"Usage: bridge [ OPTIONS ] OBJECT { COMMAND | help }\n"
|
||||||
|
" bridge [ -force ] -batch filename\n"
|
||||||
"where OBJECT := { link | fdb | mdb | vlan | monitor }\n"
|
"where OBJECT := { link | fdb | mdb | vlan | monitor }\n"
|
||||||
" OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] |\n"
|
" OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] |\n"
|
||||||
" -o[neline] | -t[imestamp] | -n[etns] name |\n"
|
" -o[neline] | -t[imestamp] | -n[etns] name |\n"
|
||||||
|
|
@ -71,6 +75,50 @@ static int do_cmd(const char *argv0, int argc, char **argv)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int batch(const char *name)
|
||||||
|
{
|
||||||
|
char *line = NULL;
|
||||||
|
size_t len = 0;
|
||||||
|
int ret = EXIT_SUCCESS;
|
||||||
|
|
||||||
|
if (name && strcmp(name, "-") != 0) {
|
||||||
|
if (freopen(name, "r", stdin) == NULL) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"Cannot open file \"%s\" for reading: %s\n",
|
||||||
|
name, strerror(errno));
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rtnl_open(&rth, 0) < 0) {
|
||||||
|
fprintf(stderr, "Cannot open rtnetlink\n");
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
cmdlineno = 0;
|
||||||
|
while (getcmdline(&line, &len, stdin) != -1) {
|
||||||
|
char *largv[100];
|
||||||
|
int largc;
|
||||||
|
|
||||||
|
largc = makeargs(line, largv, 100);
|
||||||
|
if (largc == 0)
|
||||||
|
continue; /* blank line */
|
||||||
|
|
||||||
|
if (do_cmd(largv[0], largc, largv)) {
|
||||||
|
fprintf(stderr, "Command failed %s:%d\n",
|
||||||
|
name, cmdlineno);
|
||||||
|
ret = EXIT_FAILURE;
|
||||||
|
if (!force)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (line)
|
||||||
|
free(line);
|
||||||
|
|
||||||
|
rtnl_close(&rth);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main(int argc, char **argv)
|
main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
|
@ -123,6 +171,14 @@ main(int argc, char **argv)
|
||||||
exit(-1);
|
exit(-1);
|
||||||
} else if (matches(opt, "-compressvlans") == 0) {
|
} else if (matches(opt, "-compressvlans") == 0) {
|
||||||
++compress_vlans;
|
++compress_vlans;
|
||||||
|
} else if (matches(opt, "-force") == 0) {
|
||||||
|
++force;
|
||||||
|
} else if (matches(opt, "-batch") == 0) {
|
||||||
|
argc--;
|
||||||
|
argv++;
|
||||||
|
if (argc <= 1)
|
||||||
|
usage();
|
||||||
|
batch_file = argv[1];
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"Option \"%s\" is unknown, try \"bridge help\".\n",
|
"Option \"%s\" is unknown, try \"bridge help\".\n",
|
||||||
|
|
@ -134,6 +190,9 @@ main(int argc, char **argv)
|
||||||
|
|
||||||
_SL_ = oneline ? "\\" : "\n";
|
_SL_ = oneline ? "\\" : "\n";
|
||||||
|
|
||||||
|
if (batch_file)
|
||||||
|
return batch(batch_file);
|
||||||
|
|
||||||
if (rtnl_open(&rth, 0) < 0)
|
if (rtnl_open(&rth, 0) < 0)
|
||||||
exit(1);
|
exit(1);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ bridge \- show / manipulate bridge addresses and devices
|
||||||
\fB\-V\fR[\fIersion\fR] |
|
\fB\-V\fR[\fIersion\fR] |
|
||||||
\fB\-s\fR[\fItatistics\fR] |
|
\fB\-s\fR[\fItatistics\fR] |
|
||||||
\fB\-n\fR[\fIetns\fR] name }
|
\fB\-n\fR[\fIetns\fR] name }
|
||||||
|
\fB\-b\fR[\fIatch\fR] filename }
|
||||||
|
|
||||||
.ti -8
|
.ti -8
|
||||||
.BR "bridge link set"
|
.BR "bridge link set"
|
||||||
|
|
@ -137,6 +138,16 @@ to
|
||||||
.RI "-n[etns] " NETNS " [ " OPTIONS " ] " OBJECT " { " COMMAND " | "
|
.RI "-n[etns] " NETNS " [ " OPTIONS " ] " OBJECT " { " COMMAND " | "
|
||||||
.BR help " }"
|
.BR help " }"
|
||||||
|
|
||||||
|
.TP
|
||||||
|
.BR "\-b", " \-batch " <FILENAME>
|
||||||
|
Read commands from provided file or standard input and invoke them.
|
||||||
|
First failure will cause termination of bridge command.
|
||||||
|
|
||||||
|
.TP
|
||||||
|
.BR "\-force"
|
||||||
|
Don't terminate bridge command on errors in batch mode.
|
||||||
|
If there were any errors during execution of the commands, the application
|
||||||
|
return code will be non zero.
|
||||||
|
|
||||||
.SH BRIDGE - COMMAND SYNTAX
|
.SH BRIDGE - COMMAND SYNTAX
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue