#!/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 $child; 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}; } # ============================== if (-x "__EXEC_PATH__/ebtablesd" && -x "__EXEC_PATH__/ebtablesu") { `killall ebtablesd 2>/dev/null`; $child = fork(); if ($child == 0) { $rc = `__EXEC_PATH__/ebtablesd`; if (!($rc eq "")) { exit -1; } exit 0; } $ebtables = "__EXEC_PATH__/ebtablesu"; while (!(-e "__PIPE__")) { if ((kill 0) < $child) { exit -1; } } } else { unless (-x $ebtables) { print "ERROR: $ebtables isn't executable\n"; exit -1; }; } $line = 0; while(<>) { $line++; if(m/^#/) { next; }; if(m/^$/) { next; }; if ($ebtables eq "__EXEC_PATH__/ebtablesu") { if ((kill 0) < $child) { exit -1; } } if(m/^\*(.*)/) { if (!($table eq "")) { if (!defined($ENV{'EBTABLES_SAVE_COUNTER'}) || !($ENV{'EBTABLES_SAVE_COUNTER'} eq "yes")) { $rc = `$ebtables -t $table -Z`; unless($? == 0) {print "ERROR: $rc\n"; exit -1}; } if ($ebtables eq "__EXEC_PATH__/ebtablesu") { $rc = `$ebtables commit $table`; $rc = `$ebtables free $table`; unless($? == 0) {print "ERROR: $rc\n"; exit -1}; } } $table = $1; if ($ebtables eq "__EXEC_PATH__/ebtablesu") { $rc = `$ebtables open $table`; unless($? == 0) {print "ERROR: $rc\n"; exit -1}; $rc = `$ebtables -F`; unless($? == 0) {print "ERROR: $rc\n"; exit -1}; } else { $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 (!($table eq "")) { if (!defined($ENV{'EBTABLES_SAVE_COUNTER'}) || !($ENV{'EBTABLES_SAVE_COUNTER'} eq "yes")) { $rc = `$ebtables -t $table -Z`; unless($? == 0) {print "ERROR: '-t $table -Z' failed\n"; exit -1}; } if ($ebtables eq "__EXEC_PATH__/ebtablesu") { $rc = `$ebtables commit $table`; unless($? == 0) {print "ERROR: $rc\n"; exit -1}; } } if ($ebtables eq "__EXEC_PATH__/ebtablesu") { $rc = `$ebtables quit`; unless($? == 0) {print "ERROR: $rc\n"; exit -1}; waitpid($child,0); exit 0; }