2010-12-01 3 views
0

Ruby에 대해 많이 알지 못해서이 스크립트의 기능을 이해해야합니다. 나는 그것이 가상 머신을위한 네트워크를 구성하는 규칙을 추가하는 ebtable을 호출한다는 것을 알고있다. 하지만 어떻게 확신 할 수 없습니까? 그래서 분명히 그 맥이 (확실하지 어느 것)을 adresses 패킷을 삭제/또는 그 어딘가에 전달 추출물이 스크립트는 무엇을합니까?

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

:

코드인가?

도움을 주셔서 감사합니다.

답변

1

스크립트 실행 virsh -c qemu:///system dumpxml #{VM_NAME} 여기서 VM_NAME은 스크립트의 첫 번째 매개 변수입니다.

실제로 실수로 두 번 실행합니다. 첫 번째 실행은

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

다음 그것을 두 번째로 실행하고 요소 <의 속성 디바이스의 값을 받고, 그런 다음 인터페이스를 통해 루프 변수 doc

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

의 XML 출력을 배치 목표. 이 값이 brctl show 명령의 결과 일 경우 < mac> 요소의 address 속성에서 MAC 주소를 가져옵니다.

MAC은 :으로 배열로 분할되고 해당 배열의 마지막 요소는 '00'으로 변경되고 해당 배열에서 net_mac이 생성됩니다.

#{net_mac} in_rule 지정은 새로 생성 된 net_mac으로 바뀝니다. 등등.

그러면 in_ruleout_rulesudo ebtables -A #{rule} 명령과 함께 적용됩니다.

지우기?

+0

Jonas! :) 왜 00과 함께 맥의 마지막 부분을 변경 ?? – Zenet

+1

나를 이겨, 어쩌면 http://en.wikipedia.org/wiki/MAC_address 뭔가 줄 수 있을까요? –