summaryrefslogtreecommitdiffstats
path: root/ebtables-save.in
diff options
context:
space:
mode:
Diffstat (limited to 'ebtables-save.in')
-rw-r--r--ebtables-save.in61
1 files changed, 61 insertions, 0 deletions
diff --git a/ebtables-save.in b/ebtables-save.in
new file mode 100644
index 0000000..49d733b
--- /dev/null
+++ b/ebtables-save.in
@@ -0,0 +1,61 @@
+#!/usr/bin/perl -w
+#
+#
+# A script that generates text output of the ebtables rules.
+# Similar to iptables-save.
+#
+# It can be used to store active configuration to /etc/sysconfig/ebtables
+
+use strict;
+my $table;
+my $ebtables = "__EXEC_PATH__/ebtables";
+my $cnt = "";
+my $version = "1.0";
+my $table_name;
+
+# ========================================================
+# Process filter table
+# ========================================================
+sub process_table {
+ my $chain = "";
+ my $rules = "";
+ my $chains = "";
+ my $line = "";
+
+ foreach $line (split("\n",$_[0])) {
+ if ($line =~ m/Bridge table: (.*)/) {
+ print "*$1\n";
+ next;
+ }
+ if ($line =~ m/Bridge chain: (.*?), entries:.* policy: (.*)/) {
+ $chains = $chains . ":$1 $2\n";
+ $chain = $1;
+ next;
+ }
+ if ($line =~ m/^$/) {
+ next;
+ }
+ if ($cnt eq "--Lc") {
+ $line =~ s/, pcnt = (.*) -- bcnt = (.*)/-c $1 $2/;
+ } else {
+ $line =~ s/ $//;
+ }
+ $rules = $rules . "-A $chain $line\n";
+ }
+
+ print $chains;
+ print $rules;
+ print "\n";
+}
+# ========================================================
+
+unless (-x $ebtables) { exit -1 };
+print "# Generated by ebtables-save v$version on " . `date`;
+if (defined($ENV{'EBTABLES_SAVE_COUNTER'}) && $ENV{'EBTABLES_SAVE_COUNTER'} eq "yes") {
+ $cnt = "--Lc";
+}
+foreach $table_name (split("\n", `grep -E '^ebtable_' /proc/modules | cut -f1 -d' ' | sed s/ebtable_//`)) {
+ $table =`$ebtables -t $table_name -L $cnt`;
+ unless ($? == 0) { print $table; exit -1 };
+ &process_table($table);
+}