2010-12-01 26 views
0

Je ne connais pas beaucoup Ruby et j'ai besoin de comprendre ce que fait ce script. Je sais qu'il appelle ebtables pour ajouter des règles qui configurent les réseaux pour les machines virtuelles. Mais je ne suis pas sûr de comment?que fait ce script?

Voici le code:

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

donc apparemment extraits mac (non adresses sûr) et les gouttes paquet/ou les transmet quelque part?

Merci beaucoup pour votre aide!

Répondre

1

Le script s'exécute virsh -c qemu:///system dumpxml #{VM_NAME} où VM_NAME est le premier paramètre du script.

En fait, il fonctionne deux fois, très certainement par erreur. La première course

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

puis il exécute une deuxième fois et place la sortie XML dans la variable doc

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

Il passe en boucle sur les interfaces, obtenir la valeur de l'attribut dev dans l'élément < cible. Si cette valeur est dans le résultat de la commande brctl show, il obtient l'adresse MAC de l'attribut address dans l'élément mac> <.

Le MAC est divisé en un tableau par : et le dernier élément de ce tableau est changé en '00' et le net_mac est créé à partir de ce tableau.

#{net_mac} dans l'affectation in_rule sera remplacé par le net_mac nouvellement construit. Etc.

Ensuite, les in_rule et out_rule sont appliqués avec la commande sudo ebtables -A #{rule}.

Effacer?

+0

merci beaucoup Jonas! :) pourquoi changer la dernière partie du mac avec 00 ?? – Zenet

+1

Beats moi, peut-être http://en.wikipedia.org/wiki/MAC_address pourrait donner quelque chose? –