#!/usr/bin/perl -w # # # A script that imports text ebtables rules. Similar to iptables-restore. # It can be used to restore configuration from /etc/sysconfig/ebtables. # use strict; my $ebtables = "__EXEC_PATH__/ebtables"; my $table = ""; my $rc; my $line; # ============================== # Check table # Creates user chains. # ============================== sub check_chain { if ($table eq "filter") { if ($_[1] eq "INPUT") { return; } if ($_[1] eq "FORWARD") { return; } if ($_[1] eq "OUTPUT") { return; } } if ($table eq "nat") { if ($_[1] eq "PREROUTING") { return; } if ($_[1] eq "POSTROUTING") { return; } if ($_[1] eq "OUTPUT") { return; } } if ($table eq "broute") { if ($_[1] eq "BROUTING") { return; } } $rc = `$ebtables -t $_[0] -N $_[1]`; unless($? == 0) {print "ERROR: $rc\n"; exit -1}; } # ============================== unless (-x $ebtables) { print "ERROR: $ebtables isn't executable\n"; exit -1; }; $line = 0; while(<>) { $line++; if(m/^#/) { next; }; if(m/^$/) { next; }; if(m/^\*(.*)/) { if (defined($ENV{'EBTABLES_SAVE_COUNTER'}) && !($ENV{'EBTABLES_SAVE_COUNTER'} eq "yes") && !($table eq "") ) { $rc = `$ebtables -t $table -Z`; unless($? == 0) {print "ERROR: $rc\n"; exit -1}; } $table = $1; $rc = `$ebtables -t filter --init-table`; unless($? == 0) {print "ERROR: $rc\n"; exit -1}; next; } if(m/^\:(.*?)\s(.*)/) { &check_chain($table,$1); $rc = `$ebtables -t $table -P $1 $2`; unless($? == 0) {print "ERROR(line $line): $rc\n"; exit -1}; next; } $rc = `$ebtables -t $table $_`; unless($? == 0) {print "ERROR(line $line): $rc\n"; exit -1}; } if (defined($ENV{'EBTABLES_SAVE_COUNTER'}) && !($ENV{'EBTABLES_SAVE_COUNTER'} eq "yes") && !($table eq "")) { $rc = `$ebtables -t $table -Z`; unless($? == 0) {print "ERROR: '-t $table -Z' failed\n"; exit -1}; }