]> git.proxmox.com Git - mirror_iproute2.git/commitdiff
bridge: add batch command support
authorWilson Kok <wkok@cumulusnetworks.com>
Sun, 11 Oct 2015 21:03:03 +0000 (14:03 -0700)
committerStephen Hemminger <shemming@brocade.com>
Mon, 12 Oct 2015 16:24:15 +0000 (09:24 -0700)
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>
bridge/bridge.c
man/man8/bridge.8

index eaf09c8437ce9122e546bb2eec94500384ad24f2..72f153f2bd65d42e68db7bf75d99c47abf7b58e1 100644 (file)
@@ -9,6 +9,7 @@
 #include <unistd.h>
 #include <sys/socket.h>
 #include <string.h>
+#include <errno.h>
 
 #include "SNAPSHOT.h"
 #include "utils.h"
@@ -23,6 +24,8 @@ int show_stats;
 int show_details;
 int compress_vlans;
 int timestamp;
+char *batch_file;
+int force;
 const char *_SL_;
 
 static void usage(void) __attribute__((noreturn));
@@ -31,6 +34,7 @@ static void usage(void)
 {
        fprintf(stderr,
 "Usage: bridge [ OPTIONS ] OBJECT { COMMAND | help }\n"
+"       bridge [ -force ] -batch filename\n"
 "where OBJECT := { link | fdb | mdb | vlan | monitor }\n"
 "      OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] |\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;
 }
 
+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
 main(int argc, char **argv)
 {
@@ -123,6 +171,14 @@ main(int argc, char **argv)
                                exit(-1);
                } else if (matches(opt, "-compressvlans") == 0) {
                        ++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 {
                        fprintf(stderr,
                                "Option \"%s\" is unknown, try \"bridge help\".\n",
@@ -134,6 +190,9 @@ main(int argc, char **argv)
 
        _SL_ = oneline ? "\\" : "\n";
 
+       if (batch_file)
+               return batch(batch_file);
+
        if (rtnl_open(&rth, 0) < 0)
                exit(1);
 
index 5347a5691cfebb931d1d9b949eb0726884a18ad8..d45c72892c067ca496b7ecfe07cfeee48f410d53 100644 (file)
@@ -21,6 +21,7 @@ bridge \- show / manipulate bridge addresses and devices
 \fB\-V\fR[\fIersion\fR] |
 \fB\-s\fR[\fItatistics\fR] |
 \fB\-n\fR[\fIetns\fR] name }
+\fB\-b\fR[\fIatch\fR] filename }
 
 .ti -8
 .BR "bridge link set"
@@ -137,6 +138,16 @@ to
 .RI "-n[etns] " NETNS " [ " OPTIONS " ] " OBJECT " { " COMMAND " | "
 .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