<xml> <config name = 'rc.conf'> <interfaces> <iface name = 're0' tag = 'internal'> <ip> 172.16.0.1 </ ip> <netmask> 255.255.255.240 </ netmask> <media> 1000baseTX </ media> <mediaopt> full-duplex </ mediaopt> <opts> polling </ opts> </ iface> <iface name = 're1' tag = 'external'> <ip> 172.16.0.17 </ ip> <netmask> 255.255.255.228 </ netmask> </ iface> <iface name = 'fxp0'> <dhcp> true </ dhcp> <opts> polling </ opts> </ iface> <alias iface = 're0' num = '0'> <ip> 10.0.0.1 </ ip> <netmask> 255.255.255.0 </ netmask> </ alias> <cloned> vlan101 vlan110 vlan111 </ cloned> </ interfaces> </ config> </ xml>
require 'rubygems' require 'erubis' require 'xml' def xml2hash (xml = nil) raise "missed 'xml' param" if xml.nil? v = []; h = {} loop do xml.read break if (xml.node_type == XML :: Reader :: TYPE_END_ELEMENT || xml.empty_element?) if (xml.node_type == XML :: Reader :: TYPE_ELEMENT) name = xml.name h [name] || = [] attrib = {} if (xml.attribute_count> 0) then count = xml.attribute_count while (count> 0) do count - = 1 xml.move_to_attribute (count) attrib.merge! ({xml.name => xml.value}) end end r = xml2hash (xml) case r when Hash r.merge! (attrib) unless attrib.empty? h [name] .push (r) when Array h [name] .push (attrib) unless attrib.empty? h [name] .push (* r) else h [name] .push (attrib) unless attrib.empty? h [name] .push (r) end unless r.nil? elsif (xml.node_type == XML :: Reader :: TYPE_TEXT &&! xml.value.nil?) xml.value.split ("\ n"). each {| i | i.gsub! (/ ^ \ s *? (\ S +) \ s * $ /, '\ 1'); v.push (i) unless (i.empty? || i = ~ / ^ \ s * $ /); } end end r = [] r.push (h) unless (h.nil? || h.empty?) r.push (* v) unless (v.nil? || v.empty?) return * r rescue => e puts "# {e.class}: # {e} (method: xml2hash)" end begin xml = XML :: Reader.file ('params.xml') r = xml2hash (xml) xml.close r ['xml']. first ['config']. each do | i | template = File.read (i ['name'] + ".eruby") eruby = Erubis :: Eruby.new (template) File.open (i ['name'], "w") {| file | file.puts eruby.evaluate ({: list => i})} end rescue => e puts "# {e.class}: # {e} (method: main)" end
<% for item in @list['interfaces'].first['iface'] %>
ifconfig_<%= item['name'] %>="<% unless item['dhcp'] %>inet <%= item['ip'].first %> netmask <%= item['netmask'].first %><% else %>DHCP<% end %><% unless (item['media'].nil? || item['media'].empty?) %> media <%= item['media'].first %><% end %><% unless (item['mediaopt'].nil? || item['mediaopt'].empty?) %> mediaopt <%= item['mediaopt'].first %><% end %><% unless (item['opts'].nil? || item['opts'].empty?) %> <%= item['opts'].first %><% end %>"
<% end %>
<% for item in @list['interfaces'].first['alias'] %>
ifconfig_<%= item['iface'] %>_alias<%= item['num'] %>="inet <%= item['ip'].first %> netmask <%= item['netmask'].first %>"
<% end %>
<% if @list['interfaces'].first.key?('cloned') && !@list['interfaces'].first['cloned'].empty? %>cloned_interfaces="<%= @list['interfaces'].first['cloned'].join(' ') %>"<% end %>
require 'rubygems' require 'xml' require 'benchmark' def xml2hash (xml = nil) # method definition see above end begin xml = "" Benchmark.bm do | x | x.report {100.times do xml_read = XML :: Reader.file ('params.xml') xml = xml2hash (xml_read) xml_read.close end} end p xml rescue => e puts "# {e.class}: # {e} (method: main)" end
ezhik @ pollux: ~ $ time ruby ​​xml_test.rb user system total real 0.210000 0.010000 0.220000 (0.253391) {"xml" => [{"config" => [{"name" => "rc.conf", "interfaces" => [{"alias" => [{"netmask" => ["255.255.255.0 "]," num "=>" 0 "," ip "=> [" 10.0.0.1 "]," iface "=>" re0 "}]," iface "=> [{" name "=>" re0 "," netmask "=> [" 255.255.255.240 "]," opts "=> [" polling "]," tag "=>" internal "," mediaopt "=> [" full-duplex "]," media "=> [" 1000baseTX "]," ip "=> [" 172.16.0.1 "]}, {" name "=>" re1 "," netmask "=> [" 255.255.255.228 "]," tag "= > "external", "ip" => ["172.16.0.17"]}, {"name" => "fxp0", "opts" => ["polling"], "dhcp" => ["true"] }], "cloned" => ["vlan101", "vlan110", "vlan111"]}]}]}]} real 0m0.447s user 0m0.344s sys 0m0.036s
require 'rubygems' require 'xmlsimple' require 'benchmark' xml = "" Benchmark.bm do | x | x.report {100.times do xml = XmlSimple.xml_in ('params.xml') end} end p xml
ezhik @ pollux: ~ $ time ruby ​​xml_simple.rb user system total real 1.770000 0.100000 1.870000 (1.956282) {"config" => [{"name" => "rc.conf", "interfaces" => [{"alias" => [{"netmask" => ["255.255.255.0"], "num" = > "0", "ip" => ["10.0.0.1"], "iface" => "re0"}], "iface" => [{"netmask" => ["255.255.255.240"], " name "=>" re0 "," opts "=> [" polling "]," tag "=>" internal "," mediaopt "=> [" full-duplex "]," media "=> [" 1000baseTX " ], "ip" => ["172.16.0.1"]}, {"netmask" => ["255.255.255.228"], "name" => "re1", "tag" => "external", "ip "=> [" 172.16.0.17 "]}, {" name "=>" fxp0 "," opts "=> [" polling "]," dhcp "=> [" true "]}]," cloned "= > ["\ n vlan101 \ n vlan110 \ n vlan111 \ n"]}]}]} real 0m2.279s user 0m2.012s sys 0m0.124s
ifconfig_re0 = "inet 172.16.0.1 netmask 255.255.255.240 media 1000baseTX mediaopt full-duplex polling" ifconfig_re1 = "inet 172.16.0.17 netmask 255.255.255.228" ifconfig_fxp0 = "DHCP polling" ifconfig_re0_alias0 = "inet 10.0.0.1 netmask 255.255.255.0" cloned_interfaces = "vlan101 vlan110 vlan111"
Source: https://habr.com/ru/post/73258/
All Articles