Commit 9de8c6d9 authored by Wilson Kok's avatar Wilson Kok Committed by Stephen Hemminger

bridge: add batch command support

This patch adds support to batch bridge commands.
Follows ip batch code.
Signed-off-by: default avatarWilson Kok <wkok@cumulusnetworks.com>
Signed-off-by: default avatarRoopa Prabhu <roopa@cumulusnetworks.com>
Acked-by: default avatarChristophe Gouault <christophe.gouault@6wind.com>
parent 6b53cb66
...@@ -9,6 +9,7 @@ ...@@ -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; ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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 ...@@ -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 ...@@ -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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment