From 7f257cb3dd2966aee6fdfc128ab2cb001cc123da Mon Sep 17 00:00:00 2001 From: Phil Sutter Date: Tue, 28 Feb 2017 16:11:51 +0100 Subject: [PATCH] bridge: add batch command support Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1417289 Upstream Status: iproute2.git commit 9de8c6d9765f2 commit 9de8c6d9765f284f8f15ccbe4af791259afe707e Author: Wilson Kok Date: Sun Oct 11 14:03:03 2015 -0700 bridge: add batch command support This patch adds support to batch bridge commands. Follows ip batch code. Signed-off-by: Wilson Kok Signed-off-by: Roopa Prabhu Acked-by: Christophe Gouault --- bridge/bridge.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ man/man8/bridge.8 | 11 +++++++++++ 2 files changed, 70 insertions(+) diff --git a/bridge/bridge.c b/bridge/bridge.c index eaf09c8..72f153f 100644 --- a/bridge/bridge.c +++ b/bridge/bridge.c @@ -9,6 +9,7 @@ #include #include #include +#include #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); diff --git a/man/man8/bridge.8 b/man/man8/bridge.8 index 210a3ee..2f72710 100644 --- a/man/man8/bridge.8 +++ b/man/man8/bridge.8 @@ -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 " +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 -- 1.8.3.1