2010-12-01 6 views
0

私はRubyについてよく知らないので、このスクリプトの内容を理解する必要があります。私はそれが仮想マシンのためのネットワークを構成するルールを追加するebtablesを呼び出すことを知っています。しかし、私はどのようにわからないのですか?このスクリプトは何をしますか?

これはコードです:

#!/usr/bin/env ruby 

require 'pp' 
require 'rexml/document' 

VM_NAME=ARGV[0] 

# Uncomment to act only on the listed bridges. 
#FILTERED_BRIDGES = ['beth0'] 

def activate(rule) 
    system "sudo ebtables -A #{rule}" 
end 

def get_bridges 
    bridges = Hash.new 
    brctl_exit=`brctl show` 
    cur_bridge = "" 
    brctl_exit.split("\n")[1..-1].each do |l| 
     l = l.split 
     if l.length > 1 
      cur_bridge = l[0] 
      bridges[cur_bridge] = Array.new 
      bridges[cur_bridge] << l[3] 
     else 
      bridges[cur_bridge] << l[0] 
     end 
    end 
    bridges 
end 

def get_interfaces 
    bridges = get_bridges 
    if defined? FILTERED_BRIDGES 
     FILTERED_BRIDGES.collect {|k,v| bridges[k]}.flatten 
    else 
     bridges.values.flatten 
    end 
end 

nets=`virsh -c qemu:///system dumpxml #{VM_NAME}` 

doc=REXML::Document.new(nets).root 

interfaces = get_interfaces() 

doc.elements.each('/domain/devices/interface') {|net| 
    tap=net.elements['target'].attributes['dev'] 
    if interfaces.include? tap 
     iface_mac=net.elements['mac'].attributes['address'] 

     mac=iface_mac.split(':') 
     mac[-1]='00' 
     net_mac=mac.join(':') 


     in_rule="FORWARD -s ! #{net_mac}/ff:ff:ff:ff:ff:00 -o #{tap} -j DROP" 
     out_rule="FORWARD -s ! #{iface_mac} -i #{tap} -j DROP" 

     activate(in_rule) 
     activate(out_rule) 
    end 
} 

だからどうやらそれは、MAC住所がを抽出する(わからないどれ)とパケットを廃棄/またはどこかにそれらを転送しますか?

ありがとうございました!

答えて

1

スクリプトはvirsh -c qemu:///system dumpxml #{VM_NAME}で実行されます。ここで、VM_NAMEはスクリプトの最初のパラメータです。

実際には2回、間違いなく確実に実行します。最初の実行は

nets=`virsh -c qemu:///system dumpxml #{VM_NAME}` 

それはそれをもう一度実行し、要素<に属性DEVから値を取得し、それがその後のインターフェイスをループ変数doc

doc=REXML::Document.new(nets).root 

でXML出力を配置しますターゲット。その値がbrctl showコマンドの結果である場合、< mac>要素のアドレス属性からMACアドレスを取得します。

MACは:で配列に分割され、その配列の最後の要素は '00'に変更され、net_macはその配列から作成されます。

#{net_mac} in_rule割り当てでは、新しく構築されたnet_macに置き換えられます。等々。

次に、in_ruleout_ruleは、sudo ebtables -A #{rule}コマンドで適用されます。

クリア?

+0

ありがとうJonas! :)なぜ00の最後の部分を変更しますか? – Zenet

+1

私は、おそらくhttp://en.wikipedia.org/wiki/MAC_address何かを与えることができるビート? –

関連する問題