| #!/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/; |
| } |
| $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); |
| } |