diff --git a/install.sh b/install.sh index d12827b9aa..c36ccf2cdf 100755 --- a/install.sh +++ b/install.sh @@ -458,7 +458,9 @@ TM_EXAMPLE_SHARE_FILES="share/examples/tm/tm_clone.sh \ # HOOK scripts, to be installed under $SHARE_LOCATION/hooks #------------------------------------------------------------------------------- -HOOK_SHARE_FILES="share/hooks/ebtables-xen" +HOOK_SHARE_FILES="share/hooks/ebtables-xen \ + share/hooks/ebtables-kvm \ + share/hooks/ebtables-flush" #------------------------------------------------------------------------------- # Common Cloud Files diff --git a/share/hooks/ebtables-flush b/share/hooks/ebtables-flush new file mode 100755 index 0000000000..1f1ddadec9 --- /dev/null +++ b/share/hooks/ebtables-flush @@ -0,0 +1,50 @@ +#!/usr/bin/env ruby + +def deactivate(rule) + system "sudo ebtables -D #{rule}" +end + +def get_interfaces + brctl_exit=`brctl show` + brctl_exit.split("\n")[1..-1].collect{|l| l.split.last } +end + +RULE_TYPES={ + 'INPUT' => /-i ([\w\.\-]+) /, + 'OUTPUT' => /-o ([\w\.\-]+) / +} + +def get_rules + rules=Hash.new + RULE_TYPES.each do |name, reg| + r=Array.new + ebtables_exit=`sudo ebtables -L #{name}` + rules[name]=ebtables_exit.split("\n")[3..-1].collect do |l| + line=l.strip + m=line.match(reg) + if m + interface=m[1] + { + :interface => interface, + :rule => line + } + else + nil + end + end.compact + end + + rules +end + +interfaces=get_interfaces +all_rules=get_rules + +all_rules.each do |chain, rules| + rules.each do |rule| + if !interfaces.include?(rule[:interface]) + deactivate("#{chain} #{rule[:rule]}") + end + end +end +