2017-04-26 17 views
0

私は3つのRubyオブジェクトで構成された配列を持ち、各オブジェクトはエンティティを表し、各エンティティは内部のAS番号、パブリックとプライベートのIPアドレス範囲を持っています。Rubyオブジェクトからファイルに書き込む方法

entities = [#<Entity:0x0000000288a570 @name="entity-A",@internal_asn_number=64513, @public_range=["240.28.56.0-240.28.56.255", "250.154.64.0-250.154.64.255", "251.154.65.0-251.154.65.255"], @private_range=["16.1.1.1-16.1.1.254"]>,  #<Entity:0x000000028839a0 @name="entity-B", @internal_asn_number=64514, @public_range=["195.65.46.0-195.65.46.255","196.2.84.0-196.2.84.255","197.13.105.0-197.13.105.255"], @private_range=["11.2.1.1-11.2.1.254"]>,  #<Entity:0x0000000287b0c0 @name="entity-C", @internal_asn_number=64512, @public_range=["102.206.119.0-102.206.119.255", "103.206.12.0-103.206.12.255", "104.28.90.0-104.28.90.255"], @private_range=["2.1.1.1-2.1.1.254"]>] 

私はIPが1つのユニークな変数に及ぶので、私はその後、CIDR形式に範囲を変換し、それらをマージすることができます保存: 配列はこのようになります。次に、最終結果を配列に保存します。

240.28.56.0/24 64513 
250.154.64.0/24 64513 
251.154.65.0/24 64513 
16.1.1.1/32 64513 

そして、私は次のコードを持っている:最後に、私は(AS番号/マージされたIPアドレス)形式のファイルに出力を書き込みしよう

require 'netaddr' 

cidrs = Array.new 

File.open('out.dat', "w") do |f| 
    entities.each do |entity| 
     asn = entity.internal_asn_number 
     ranges = entity.public_range + entity.private_range 
     ranges.each do |ip_range| 
     new_range = ip_range.split(/\s*-\s*/) 
     startip = new_range[0] 
     endip = new_range[1] 
     ip_net_range = NetAddr.range(startip, endip, :Inclusive => true, :Objectify => true) 
     cidrs << NetAddr.merge(ip_net_range) 
     end 
     new_cidrs = cidrs.flatten 
     new_cidrs.each do |ip| 
     f.write("#{ip}\t #{asn}\n") 
     end 
    end 
end 

このコードは私に与え、次の出力:

240.28.56.0/24 64513 
250.154.64.0/24 64513 
251.154.65.0/24 64513 
16.1.1.1/32 64513 
16.1.1.2/31 64513 
16.1.1.4/30 64513 
16.1.1.8/29 64513 
16.1.1.16/28  64513 
16.1.1.32/27  64513 
16.1.1.64/26  64513 
16.1.1.128/26 64513 
16.1.1.192/27 64513 
16.1.1.224/28 64513 
16.1.1.240/29 64513 
16.1.1.248/30 64513 
16.1.1.252/31 64513 
16.1.1.254/32 64513 
240.28.56.0/24 64514 
250.154.64.0/24 64514 
251.154.65.0/24 64514 
16.1.1.1/32 64514 
16.1.1.2/31 64514 
16.1.1.4/30 64514 
16.1.1.8/29 64514 
16.1.1.16/28  64514 
16.1.1.32/27  64514 
16.1.1.64/26  64514 
16.1.1.128/26 64514 
16.1.1.192/27 64514 
16.1.1.224/28 64514 
16.1.1.240/29 64514 
16.1.1.248/30 64514 
16.1.1.252/31 64514 
16.1.1.254/32 64514 
195.65.46.0/24 64514 
196.2.84.0/24 64514 
197.13.105.0/24 64514 
11.2.1.1/32 64514 
11.2.1.2/31 64514 
11.2.1.4/30 64514 
11.2.1.8/29 64514 
11.2.1.16/28  64514 
11.2.1.32/27  64514 
11.2.1.64/26  64514 
11.2.1.128/26 64514 
11.2.1.192/27 64514 
11.2.1.224/28 64514 
11.2.1.240/29 64514 
11.2.1.248/30 64514 
11.2.1.252/31 64514 
11.2.1.254/32 64514 
240.28.56.0/24 64512 
250.154.64.0/24 64512 
251.154.65.0/24 64512 
16.1.1.1/32 64512 
16.1.1.2/31 64512 
16.1.1.4/30 64512 
16.1.1.8/29 64512 
16.1.1.16/28  64512 
16.1.1.32/27  64512 
16.1.1.64/26  64512 
16.1.1.128/26 64512 
16.1.1.192/27 64512 
16.1.1.224/28 64512 
16.1.1.240/29 64512 
16.1.1.248/30 64512 
16.1.1.252/31 64512 
[...] 

基本的には、IPアドレスがファイルに3回を書かれて、私が期待していたことはようにエンティティAとのAS番号を持つエンティティ-AからマージされたIPアドレスを持っていたされています。

私は何が間違っているのか分かりません。

+0

配列を生成します。 '#Entity:0x0000000288a570 ... 'を作成するコードを再生成するように頼むと、あなたを助けようとするときに時間が浪費され、私たちが助けることができる他のもののために無駄になります。 「[mcve]」を参照してください。 –

+0

ありがとう@theTinMan私はそれを知らなかった、私は単純にしようとしていたが、代わりに私は複雑です!次回はもっと慎重になるよ! – mf370

+0

今回はそれを修正しておけば本当に助かります。スタックオーバーフローはディスカッションリストではなく、オンライン参考書のようなものであり、あなたの質問は新しい記事であることを覚えておいてください。このように、記事を理にかなったものにすることが重要です。よく質問された質問が投票を集める。 –

答えて

1

重複するエントリを取得する理由は、各エンティティをループする前にcidrs配列が宣言されているため、2番目のエンティティにすべての最初のエンティティと1番目のエンティティが含まれているということです。

あなたは動作しているようentityループにcidrs配列の宣言を移動した場合:私たちは、入力データの配列を示す場合には、コードのことを提供代わりに、 `inspect`出力を使用しないでください

File.open('out.dat', "w") do |f| 
    entities.each do |entity| 
     cidrs = Array.new 
+0

ありがとう@ c3st7n !!そのようなダムの間違い! – mf370

関連する問題